Просматривая исходный код правила 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 и как он работает?
источник
console.assert()
соответствующей переменной перед добавлением!
после нее. Поскольку add!
говорит компилятору игнорировать проверку на ноль, он компилируется в noop в javascript. Так что, если вы не уверены, что переменная не равна нулю, тогда лучше сделать явную проверку утверждения.dict.has(key) ? dict.get(key) : 'default';
компилятору TS, не может сделать вывод, чтоget
вызов никогда не возвращает null / undefined.dict.has(key) ? dict.get(key)! : 'default';
сужает тип правильно.Ответ Луи великолепен, но я подумал, что я хотел бы кратко изложить его:
Оператор bang указывает компилятору временно ослабить ограничение «не ноль», которое может потребоваться в противном случае. Он говорит компилятору: «Как разработчик, я лучше вас знаю, что эта переменная не может быть нулевой прямо сейчас».
источник
var
илиlet
неявно инициализированыundefined
. Кроме того, свойства экземпляра класса могут быть объявлены как таковые, чтоclass C { constructor() { this.myVar = undefined; } }
вполне допустимо. Наконец, хуки жизненного цикла зависят от структуры; например, Angular и React реализуют их по-разному. Поэтому нельзя ожидать, что компилятор TS расскажет о них.