首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在打字稿中,什么是!(感叹号/邦)操作符时取消对成员的引用?

问在打字稿中,什么是!(感叹号/邦)操作符时取消对成员的引用?
EN

Stack Overflow用户
提问于 2017-02-16 12:22:26
回答 5查看 440.1K关注 0票数 1.2K

在查看tslint规则的源代码时,我看到了以下语句:

代码语言:javascript
复制
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

注意!操作符在node.parent之后。有意思的!

我首先尝试用当前安装的TS (1.5.3)版本在本地编译该文件。由此产生的错误指向了爆炸的确切位置:

代码语言:javascript
复制
$ tsc --noImplicitAny memberAccessRule.ts 
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.

接下来,我升级到最新的TS (2.1.6),它没有问题地编译了它。因此,它似乎是TS 2.x的特性。但- JS:

代码语言:javascript
复制
if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

到目前为止,我的谷歌福已经让我失望了。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-02-16 12:29:18

这是非空断言操作符。这是一种告诉编译器“这个表达式不能是null或undefined,所以不要抱怨它可能是null或undefined”。有时,类型检查器本身无法作出该确定。

解释了这里

一个新的!后缀表达式运算符可以用来断言它的操作数是非空的,并且在类型检查器无法得出这个事实的上下文中是非定义的。具体来说,x!操作生成一个x类型的值,其中排除了null和undefined。类似于表单<T>x和x as T的类型断言,在发出的JavaScript代码中只需删除!非空断言操作符。

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

票数 1.6K
EN

Stack Overflow用户

发布于 2017-05-10 11:32:23

路易的回答很好,但我想我应该简明扼要地总结一下:

bang操作符告诉编译器暂时放松它可能需要的“null”约束。它对编译器说:“作为开发人员,我比您更清楚这个变量现在不能为null”。

票数 393
EN

Stack Overflow用户

发布于 2020-06-27 12:08:42

非空断言运算符

使用非空断言操作符,我们可以显式地告诉编译器,表达式的值不是null或undefined。当编译器无法确定地推断类型时,这可能是有用的,但是我们比编译器有更多的信息。

示例

TS代码

代码语言:javascript
复制
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特性。

代码语言:javascript
复制
"use strict";
function simpleExample(nullableArg) {
    const normal = nullableArg;
    const operatorApplied = nullableArg;
}
票数 84
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42273853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档