В Typescript, что есть! (восклицательный знак/взрыв) при разыменовании члена?

При взгляде на исходный код для правила tslint я натолкнулся на следующее утверждение:

if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

Обратите внимание на оператор ! после node.parent. Интересно!

Сначала я попытался скомпилировать файл локально с моей установленной версией TS (1.5.3). Полученная ошибка указала на точное местоположение взрыва:

$ tsc --noImplicitAny memberAccessRule.ts 
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.

Затем я обновил до последней версии TS (2.1.6), которая скомпилировала ее без проблем. Так что, похоже, это особенность TS 2.x. Но транспиляция полностью игнорировала удар, в результате получилось следующее JS:

if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

Мой Google fu до сих пор провалил меня.

Что такое оператор восклицательной метки TS и как он работает?

Ответ 1

Это непустой оператор утверждения. Это способ рассказать компилятору "это выражение не может быть null или undefined здесь, поэтому не жалуйтесь на возможность того, что это null или undefined." Иногда средство проверки типов не может самостоятельно выполнить это определение.

Здесь объясняется :

Новый оператор выражения post-fix ! может использоваться для утверждения, что его операнд не равен null и не undefined в контекстах, где средство проверки типов не может завершить этот факт. В частности, операция x! выдает значение типа x с null и undefined исключенным. Подобно утверждениям типа форм <T>x и x as T, оператор ! non-null asserting просто удаляется в испущенном JavaScript-коде.

Я считаю, что использование термина "утверждать" немного вводит в заблуждение в этом объяснении. Это "утверждение" в том смысле, что разработчик утверждает это, а не в том смысле, что тест будет выполнен. Последняя строка действительно указывает на то, что это не приводит к испусканию кода JavaScript.

Ответ 2

Ответ Луи замечателен, но я подумал, что попытаюсь кратко подвести итог:

Оператор bang сообщает компилятору временно ослабить ограничение "не null", которое в противном случае могло бы потребоваться. Он говорит компилятору: "Как разработчик, я знаю лучше вас, что эта переменная не может быть нулевой прямо сейчас".