TypeScript: действительно ли имеют значение вопросительные знаки для дополнительных свойств CLASS? - PullRequest
0 голосов
/ 06 ноября 2018

В TypeScript я уже знаю, что вы используете вопросительный знак для пометки аргумента функции или свойства интерфейса как необязательного. Кроме того, TypeScript выдаст вам ошибки, если вы не установите необязательные значения при использовании функции или интерфейса.

Но TypeScript также позволяет использовать знак вопроса в свойствах class , например:

class MyClass {

    propertyWithoutQuestionMark:string;
    propertyWithQuestionMark?:string; // what's the difference?

}

Есть ли какая-либо разница между двумя вышеупомянутыми свойствами с точки зрения того, как TypeScript позволит вам использовать (не использовать) или класс в целом?

Все, что я нахожу в Интернете, похоже, говорит об аргументах функций и интерфейсах. Но не нашел объяснения, что это значит в свойствах CLASS .

Если возможно, пример кода будет полезен для демонстрации чего-то, где TypeScript сообщит об ошибке для одного из свойств, но не другого.

1 Ответ

0 голосов
/ 06 ноября 2018

Принимая ваш пример и компилируя с включенными strictNullChecks и strictPropertyInitialization, уже выдается ошибка (компиляция без этих двух включенных опций не даст ошибки), как видно на игровой площадке : Property 'propertyWithoutQuestionMark' has no initializer and is not definitely assigned in the constructor.

Для того, чтобы он скомпилировался, вы должны инициализировать как минимум свойство, не допускающее обнуление, в конструкторе или использовать инициализатор, например ::

.
class MyClass {
  propertyWithoutQuestionMark:string;
  propertyWithQuestionMark?: string;
  constructor(parameterOne: string) {
    this.propertyWithoutQuestionMark = parameterOne;
  }
}

Необязательное свойство propertyWithQuestionMark не нужно инициализировать в конструкторе

...