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

if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

注意node.parent后面的!号操作员.有趣的

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

$ tsc --noImplicitAny memberAccessRule.ts 
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.

接下来,我升级到了最新的TS(2.1.6),它编译后没有问题.所以这似乎是TS 2的特点.x、 But透明完全忽略了爆炸,导致以下JS:

if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

到目前为止,我的谷歌fu让我失望.

What is TS's exclamation mark operator, and how does it work?

推荐答案

这是非空断言运算符.这是一种告诉编译器"这个表达式在这里不能是nullundefined,所以不要抱怨它可能是nullundefined."有时,类型判断器无法自行确定.

It is explained here:

在类型判断器无法得出结论的上下文中,可以使用新的! post fix表达式运算符来断言其操作数是非null和非未定义的.具体地,操作x!产生排除nullundefinedx类型的值.与表单<T>xx as T的类型断言类似,!非空断言运算符在发出的JavaScript代码中被简单删除.

我发现在这种解释中使用"断言"一词有点误导.它是the developer is asserting it的"断言",而不是将要执行的测试.最后一行确实表明,它不会导致任何JavaScript代码被发出.

Typescript相关问答推荐

强制两个类型脚本对象具有相同的键

类型脚本强制泛型类型安全

如何在typescript中设置对象分配时的键类型和值类型

角效用函数的类型推断

在Typescript 中,有没有`index=unfined的速记?未定义:某个数组[索引]`?

react 路由Use RouteLoaderData类型脚本错误

将带点的对象键重新映射为具有保留值类型的嵌套对象

如何将父属性类型判断传播到子属性

如何按属性或数字数组汇总对象数组

使用泛型识别对象值类型

Typescript 中相同类型的不同结果

创建依赖函数参数的类型

在Reaction中折叠手风琴

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?

确保财产存在

如何使用 AWS CDK 扩展默认 ALB 控制器策略?

数据库中的表请求返回如下日期:2023-07-20T21:39:00.000Z 我需要将此数据格式化为 dd/MM/yyyy HH:mm

带动态键的 TS 功能

Angular另一个组件的nativeelement未定义

在Typescript 无法正常工作的 Three.js 中更新动画中的 GLSL 统一变量