В 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.икс. но транспиляция полностью проигнорировала взрыв, что привело к следующему JS:

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

мой Google-фу не мне.

что такое оператор восклицательного знака TS и как он работает?

2 ответов


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

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

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

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


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

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