在查看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;
}到目前为止,我的谷歌福已经让我失望了。
TS的感叹号操作符是什么,它是如何工作的?
发布于 2017-02-16 12:29:18
这是非空断言操作符。这是一种告诉编译器“这个表达式不能是null或undefined,所以不要抱怨它可能是null或undefined”。有时,类型检查器本身无法作出该确定。
解释了这里
一个新的
!后缀表达式运算符可以用来断言它的操作数是非空的,并且在类型检查器无法得出这个事实的上下文中是非定义的。具体来说,x!操作生成一个x类型的值,其中排除了null和undefined。类似于表单<T>x和x as T的类型断言,在发出的JavaScript代码中只需删除!非空断言操作符。
我觉得在解释中使用“断言”一词有点误导。它是“断言”,在开发人员断言它的意义上,而不是在将要执行测试的意义上。最后一行确实表示没有发出JavaScript代码。
发布于 2017-05-10 11:32:23
路易的回答很好,但我想我应该简明扼要地总结一下:
bang操作符告诉编译器暂时放松它可能需要的“null”约束。它对编译器说:“作为开发人员,我比您更清楚这个变量现在不能为null”。
发布于 2020-06-27 12:08:42
非空断言运算符
使用非空断言操作符,我们可以显式地告诉编译器,表达式的值不是null或undefined。当编译器无法确定地推断类型时,这可能是有用的,但是我们比编译器有更多的信息。
示例
TS代码
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特性。
"use strict";
function simpleExample(nullableArg) {
const normal = nullableArg;
const operatorApplied = nullableArg;
}https://stackoverflow.com/questions/42273853
复制相似问题