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

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

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

class MyClass {

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

}

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

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

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

Знак вопроса означает, что свойство может быть null (или undefined). В противном случае вы получите сообщение об ошибке, если не назначите его в конструкторе.

UnholySheep 06.11.2018 08:59

Спасибо @UnholySheep. Кажется, нет необходимости определять какие-либо свойства в конструкторе? Если это не связано с какой-то конкретной настройкой tsconfig? Хотя я заметил, что он показывает ошибку, если я специально пытаюсь установить myPropertyWithoutQuestionMark=undefined

LaVache 06.11.2018 09:05
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
2
414
1

Ответы 1

Взяв ваш пример и компиляция с включенными 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 не нужно инициализировать в конструкторе.

Другие вопросы по теме