Я уже знаю, что в TypeScript вы используете вопросительный знак, чтобы пометить аргумент функции или свойство интерфейса как необязательные. И TypeScript выдаст вам ошибки, если вы не укажете необязательные значения при использовании функции или интерфейса.
Но TypeScript также позволяет использовать вопросительный знак в свойствах класс, например:
class MyClass {
propertyWithoutQuestionMark:string;
propertyWithQuestionMark?:string; // what's the difference?
}
Есть ли разница между двумя приведенными выше свойствами с точки зрения того, как TypeScript позволит вам использовать (не использовать) их или класс в целом?
Все, что я нахожу в сети, похоже, говорит только об аргументах функций и интерфейсах. Но не нашел объяснения, что это значит в свойствах КЛАСС.
Если возможно, какой-нибудь пример кода был бы хорош, чтобы показать что-то, где TypeScript будет сообщать об ошибке для одного из свойств, но не для другого.
Спасибо @UnholySheep. Кажется, нет необходимости определять какие-либо свойства в конструкторе? Если это не связано с какой-то конкретной настройкой tsconfig? Хотя я заметил, что он показывает ошибку, если я специально пытаюсь установить myPropertyWithoutQuestionMark=undefined






Взяв ваш пример и компиляция с включенными strictNullChecks и strictPropertyInitialization уже дает ошибку (компиляция без этих двух включенных опций не приведет к ошибке), как можно увидеть на площадке:
Property 'propertyWithoutQuestionMark' has no initializer and is not definitely assigned in the constructor.
Чтобы он скомпилировался, вы должны инициализировать как минимум свойство, не допускающее значения NULL, в конструкторе или использовать инициализатор, например:
class MyClass {
propertyWithoutQuestionMark:string;
propertyWithQuestionMark?: string;
constructor(parameterOne: string) {
this.propertyWithoutQuestionMark = parameterOne;
}
}
Необязательное свойство propertyWithQuestionMark не нужно инициализировать в конструкторе.
Знак вопроса означает, что свойство может быть
null(илиundefined). В противном случае вы получите сообщение об ошибке, если не назначите его в конструкторе.