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


при просмотре исходного кода для Правила 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 130

2 ответа:

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

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

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

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

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

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