Texto datilografado: significado de? e! nas propriedades da classe

Aug 17 2020
@Column({ name: 'device_kind', type: 'int2', nullable: false })
deviceKind?: number;

Alguém pode explicar esse código? Não entendi por que eles adicionaram o '?' marca. e alguns deles tem '!' em vez de ponto de interrogação. O que eles querem dizer?

Respostas

2 Evert Aug 18 2020 at 01:49

Esta é realmente uma questão de texto digitado, não TypeORM.

Quando você define uma propriedade como esta:

type Foo = {
  prop1?: number
}

Você está dizendo que prop1é opcional.

Quando uma propriedade é precedida por !, significa que você está dizendo ao Typescript para não avisá-lo de que você não a inicializou no construtor (do qual normalmente reclamará no modo estrito).

Exemplo:

class Foo {
  // Typescript does not complain about `a` because we set it in the constructor
  public a: number;

  // Typescript will complain about `b` because we forgot it.
  public b: number;

  // Typescript will not complain about `c` because we told it not to.
  public c!: number;

  // Typescript will not complain about `d` because it's optional and is
  // allowed to be undefined.
  public d?: number;

  constructor() {
    this.a = 5;
  }

}

Deve-se notar que o c!caso na classe acima é realmente uma maneira de dizer ao Typescript: "Eu sei o que estou fazendo, eu sei que estou definindo isso em algum lugar, apenas não no construtor. Por favor, não reclame".

Este não é o mesmo que o d?caso, porque isso significa apenas que dé permitido ser um number ou undefined .