在打字稿中,什么是!解除引用会员时(感叹号/爆炸)运营商?在查看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的感叹号操作符,它是如何工作的?
3 回答
有只小跳蛙
TA贡献1824条经验 获得超8个赞
那是非空断言运算符。这是一种告诉编译器“这个表达式不能null
或undefined
在这里,所以不要抱怨它null
或它的可能性undefined
”的方法。有时类型检查器本身无法做出决定。
这里解释如下:
可以使用新的
!
post-fix表达式运算符来断言其操作数在类型检查器无法推断该事实的上下文中是非空且非未定义的。具体而言,该操作x!
产生x
具有null
和undefined
排除的类型的值。类似键入的形式断言<T>x
和x as T
,所述!
非空断言操作者简单地在所发射的JavaScript代码移除。
我发现在这个解释中使用“断言”一词有点误导。它是“断言”的,即开发人员断言它,而不是在将要执行测试的意义上。最后一行确实表明它不会发出任何JavaScript代码。
largeQ
TA贡献2039条经验 获得超7个赞
路易斯的答案很棒,但我想我会试着简洁地总结一下:
bang运算符告诉编译器暂时放松它可能需要的“非空”约束。它告诉编译器:“作为开发人员,我比你更了解这个变量现在不能为null”。
慕田峪4524236
TA贡献1875条经验 获得超5个赞
作为一个激励性的例子:使用新的ES Map类型和dict.has(key) ? dict.get(key) : 'default';
TS编译器之类的代码不能推断出get
调用永远不会返回null / undefined。dict.has(key) ? dict.get(key)! : 'default';
正确缩小类型。
添加回答
举报
0/150
提交
取消