gpt4 book ai didi

typescript - 为什么非空断言运算符(!)不向生成的 JS 发出实际的非空和非未定义检查

转载 作者:行者123 更新时间:2023-12-05 00:58:59 26 4
gpt4 key购买 nike

在使用非空断言运算符时,Typescript 编译器向生成的 JS 发出非未定义和非空检查似乎是合理的。即:

function fun1(node: SomeType | undefined) {
fun2(node!);
}

应该转换为:

function fun1(node) {
if (node === undefined || node === null) {
throw new Error('The non-null assertion failed!');
}
fun2(node);
}

然而,正如文档所说,它只会被转译为:

function fun1(node) {
fun2(node);
}

为什么会这样?没有将检查添加到输出 JS 代码中的原因是什么?

最佳答案

非空断言运算符的意义在于告诉 TypeScript 编译器您已经知道该变量不为空。考虑以下场景:

function fun1(node: SomeType | undefined) {
throwIfUndefined(node);
node!.fun2();
}

如果 node 未定义,你调用一个你知道会抛出异常的函数。因此,实际上没有必要在调用 fun2 之前检查节点是否未定义。但是,TypeScript 编译器无法推断出这一点,因此如果没有感叹号,它将拒绝编译您的代码,因为它认为您没有处理 null 情况。但是,如果您作为程序员知道这种情况永远不会发生,为什么要在最终产品中插入一个会消耗 CPU 周期的冗余检查呢?非空断言操作符实际上只是告诉编译器的一种方式,“是的,我知道你不能说这个变量不会为空,但我这样做让我别碍事。”

此外,在无论如何都会抛出错误的代码之前抛出错误有什么意义?类似“非空断言失败!”的消息并不比标准的空引用消息更有帮助。

关于typescript - 为什么非空断言运算符(!)不向生成的 JS 发出实际的非空和非未定义检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54903379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com