在查看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;
}
到目前为止,我的谷歌fu让我失望了。
TS的感叹号操作符是什么,它是如何工作的?
非空断言运算符
使用非空断言运算符,我们可以显式地告诉编译器表达式的值不是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的一个特性
"use strict";
function simpleExample(nullableArg) {
const normal = nullableArg;
const operatorApplied = nullableArg;
}
非空断言运算符
使用非空断言运算符,我们可以显式地告诉编译器表达式的值不是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的一个特性
"use strict";
function simpleExample(nullableArg) {
const normal = nullableArg;
const operatorApplied = nullableArg;
}