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

Мой гугл-фу меня пока подвел.

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

Mike Chamberlain

Ответов: 3

Ответы (3)

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

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

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

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

Оператор ненулевого утверждения

С помощью ненулевого оператора утверждения мы можем явно сообщить компилятору, что выражение имеет значение, отличное от null или undefined. Это может быть полезно, когда компилятор не может точно определить тип, но у нас больше информации, чем у компилятора.

Пример

Код TS

function simpleExample(nullableArg: number | undefined | null) {
   const normal: number = nullableArg; 
    //   Compile err: 
    //   Type 'number | null | undefined' is not assignable to type 'number'.
    //   Type 'undefined' is not assignable to type 'number'.(2322)

   const operatorApplied: number = nullableArg!; 
    // compiles fine because we tell compiler that null | undefined are excluded 
}

Скомпилированный JS-код

Обратите внимание, что JS не знает концепции оператора утверждения ненулевого значения, поскольку это функция TS

"строгое использование";
function simpleExample (nullableArg) {
    const normal = nullableArg;
    const operatorApplied = nullableArg;
 }

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

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

2022 WebDevInsider