Машинопись: значение? и ! в свойствах класса

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

Кто-нибудь может объяснить этот код? Я не понял, почему они добавили "?" отметка. и у некоторых из них есть "!" вместо вопросительного знака. Что они имеют в виду?

Ответы

2 Evert Aug 18 2020 at 01:49

Это действительно вопрос Typescript, а не TypeORM.

Когда вы определяете такое свойство:

type Foo = {
  prop1?: number
}

Вы говорите, что prop1это необязательно.

Если перед свойством стоит указание, !это означает, что вы говорите Typescript не предупреждать вас о том, что вы не инициализировали его в конструкторе (на что он обычно будет жаловаться в строгом режиме).

Пример:

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;
  }

}

Следует отметить, что c!случай в приведенном выше классе на самом деле является способом сказать Typescript: «Я знаю, что делаю, я знаю, что устанавливаю это где-то, только не в конструкторе. Пожалуйста, не жалуйтесь».

Это не то же самое, что и d?случай, потому что это просто означает, что dразрешено быть number или undefined .