在打字稿中,什么是!解除引用会员时(感叹号/爆炸)运营商?

在打字稿中,什么是!解除引用会员时(感叹号/爆炸)运营商?

在查看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的感叹号操作符,它是如何工作的?


温温酱
浏览 535回答 3
3回答

有只小跳蛙

那是非空断言运算符。这是一种告诉编译器“这个表达式不能null或undefined在这里,所以不要抱怨它null或它的可能性undefined”的方法。有时类型检查器本身无法做出决定。这里解释如下:可以使用新的!post-fix表达式运算符来断言其操作数在类型检查器无法推断该事实的上下文中是非空且非未定义的。具体而言,该操作x!产生x具有null和undefined排除的类型的值。类似键入的形式断言<T>x和x as T,所述!非空断言操作者简单地在所发射的JavaScript代码移除。我发现在这个解释中使用“断言”一词有点误导。它是“断言”的,即开发人员断言它,而不是在将要执行测试的意义上。最后一行确实表明它不会发出任何JavaScript代码。

largeQ

路易斯的答案很棒,但我想我会试着简洁地总结一下:bang运算符告诉编译器暂时放松它可能需要的“非空”约束。它告诉编译器:“作为开发人员,我比你更了解这个变量现在不能为null”。

慕田峪4524236

作为一个激励性的例子:使用新的ES Map类型和dict.has(key) ? dict.get(key) : 'default';TS编译器之类的代码不能推断出get调用永远不会返回null / undefined。dict.has(key) ? dict.get(key)! : 'default';正确缩小类型。
打开App,查看更多内容
随时随地看视频慕课网APP