【发布时间】:2019-09-16 16:04:38
【问题描述】:
我是打字稿的新手,我的教科书说:
只有在您知道不会出现空值时才应使用非空断言。如果您应用断言并且确实出现空值,则会导致运行时错误。
所以我写了一个简单的打字稿文件来验证(使用“strictNullChecks”:true):
function calculateTax(amount: number, format: boolean): string | number | null {
if (amount === 0) {
return null;
}
const calcAmount = amount * 1.2;
return format ? `$${calcAmount.toFixed(2)}` : calcAmount;
}
let taxValue: string | number = calculateTax(0, false)!;
以下是我的问题:
Q1-我们可以看到calculateTax(0, false)会返回null,我运行程序后,完全没有运行时错误?为什么作者说会有运行时错误?
Q2-我可以将没有非空断言的语句重写为:
let taxValue: string | number = calculateTax(0, false);
它没有编译错误和运行时错误,完美运行,那么使用非空断言有什么意义呢?
【问题讨论】:
-
如果您对
null进行操作,会出现运行时错误。 TS 编译为 JS,所以很自然地你可以拥有nulls 并且仅仅存在一个不会造成问题。但是calculateTax(0, false).toString()会导致 TypeError。 -
至于第二季度 - 你可以,但仍然可以返回
null,所以不仅仅是string或number。 -
@VLAZ 我知道
calculateTax(0, false).toString()会导致 TypeError。所以我们只需要使用 typeof 来说明,这正是我的问题,如果你仍然需要手动检查它,那么使用非 null 断言有什么意义呢? -
非空断言适用于当您作为程序员知道您不会得到
null但TS 无法解决的情况。例如,您执行calculateTax(userInput, false),这可能导致null为userInput = 0,但您实际上是在该值到达代码的那个点之前过滤该值。 TS 无法解决这个问题(例如,它不知道您的验证逻辑),但它知道结果可能是null。然而,你知道你永远不会有userInput = 0,所以你可以告诉 TS。
标签: javascript typescript