Машинописный текст: знак вопроса после аннотации типа в выражении присваивания (нулевой тип?)

Сегодня я обнаружил, что могу сделать это:

let foo: string? // foo now has type string | null

Что это такое? Я не могу найти ссылку на него в справочнике TS. Может ли кто-нибудь указать на это?

Другой (хотя и не менее важный) вопрос: почему, черт возьми, он выдает string | null, а не string | undefined? Потому что последнее было бы намного полезнее, так как объявленная (но не инициализированная) переменная обычно имеет тип undefined. Это еще больше сбивает с толку, учитывая, что интерфейсы вопросительного знака дают нам тип ... | undefined.

P.S. Моя версия ТС 3.4.3

УПД. Кажется, это ошибка. Работает, только если за ним следует оператор if:

let foo: string?
if (1) {

}

Тогда, опять же, ок, это баг, но почему он выдал string | null?


2
422
2

Ответы:

Оказывается, реализуется эта особенность, и для правильной работы во всех случаях требуется ; после ?.


Решено

Похоже, это предназначено для поддержки некоторой версии нотации типа JSDoc с нулевым значением (то есть | null) для использования TypeScript для проверки файлов JavaScript. Если вы начнете использовать синтаксис JSDoc в файле TypeScript, я ожидаю увидеть ошибку... что я вижу в игровая площадка:

let foo: string?; // error!
// JSDoc types can only be used inside documentation comments.

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


Я говорю «некоторая версия», потому что официальный способ JSDoc аннотирующих типов как обнуляемых заключается в использовании ? как оператора приставка, а не как оператора постфикс. То есть JSDoc говорит использовать @type {?string} вместо @type {string?}.

Судя по всему, Google Компилятор закрытия неофициально поддерживает постфикс-?, и я предполагаю, что TypeScript тоже. Но это не соответствует официальному стандарту JSDoc и может даже закончиться удаляют из ТС. Поэтому я бы не стал полагаться на то, что он останется, даже если вы используете комментарии типа JSDoc в своем коде.

Хорошо, надеюсь, это поможет. Удачи!