在查看 tslint 规则的源代码时,我遇到了以下语句:
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) { return; }
注意!后面的运算符node.parent。有趣的!
!
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; }
到目前为止,我的 Google fu 让我失望了。
TS 的感叹号运算符是什么,它是如何工作的?
那是非空断言运算符。这是一种告诉编译器“这个表达式不能是nullor undefined,所以不要抱怨它是nullor的可能性undefined”的方法。有时类型检查器本身无法做出决定。
null
undefined
这里解释:
在类型检查器无法得出该事实的上下文中,可以使用新!的后缀表达式运算符来断言其操作数是非空且非未定义的。具体来说,该操作x!产生类型为xwithnull和undefinedexclude 的值。<T>x与和的类型断言类似x as T,!非空断言运算符在发出的 JavaScript 代码中被简单地删除。
x!
x
<T>x
x as T
我发现在该解释中使用“断言”一词有点误导。 在开发人员断言它 的意义上,它是“断言” ,而不是在将要执行测试的意义上。最后一行确实表明它不会发出任何 JavaScript 代码。