小编典典

在 Typescript 中,什么是 ! (感叹号/砰)操作员取消引用成员时?

all

在查看 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;
}

到目前为止,我的 Google fu 让我失望了。

TS 的感叹号运算符是什么,它是如何工作的?


阅读 166

收藏
2022-02-28

共1个答案

小编典典

那是非空断言运算符。这是一种告诉编译器“这个表达式不能是nullor
undefined,所以不要抱怨它是nullor的可能性undefined”的方法。有时类型检查器本身无法做出决定。

这里解释:

在类型检查器无法得出该事实的上下文中,可以使用新!的后缀表达式运算符来断言其操作数是非空且非未定义的。具体来说,该操作x!产生类型为xwithnullundefinedexclude
的值。<T>x与和的类型断言类似x as T!非空断言运算符在发出的 JavaScript 代码中被简单地删除。

我发现在该解释中使用“断言”一词有点误导。 在开发人员断言它 的意义上,它是“断言” ,而不是在将要执行测试的意义上。最后一行确实表明它不会发出任何
JavaScript 代码。

2022-02-28