В 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 прямо сейчас".