我是打字稿新手,我的课本上写着:
仅当您知道不会出现空值时,才应使用非空断言。如果您应用断言,并且会出现空值,则会导致运行时错误。
所以我写了一个简单的打字稿文件来验证(带有“ 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-我可以不使用非null断言来重写语句为:
let taxValue: string | number = calculateTax(0, false);
它没有编译错误和运行时错误,可以完美运行,那么使用非null断言有什么意义呢?
答案 0 :(得分:2)
我猜您误解了类型断言的作用。这不是编译器可以确保的事情,而是您向编译器说的“放弃”,即“我特此放弃对此类型进行检查的权利,我保证在运行时它将为X,如果出现这种情况,我将负责”它不是”。
通过使用!
断言,您基本上是在告诉编译器“关闭,我知道更好,这永远不会为空”。编译器别无选择,只能同意您的意见,但是如果您不遵守承诺(您不遵守),那么运行时错误就迫在眉睫。
很显然,类型断言从来都不是一个好主意。最后,Typescript的重点是静态检查您的类型。在将!
或as
放在这里和那里之前,请三思。
答案 1 :(得分:1)
如果使用--strictNullChecks
运行编译,则编译错误
error TS2531: Object is possibly 'null'.
应该被提出。我猜想作者打算指出,如果继续使用假定为非空的对象,则非空断言会导致运行时异常。
例如,在上面的示例中使用非空断言在taxValue
上调用函数不会警告您该值可能为null,但如果为null,并且您在运行时调用该函数,则会引发一个
可以使用non-null断言消除虚假的警告,即可以将其类型可以为null的knonw-non-null变量当作不可空变量使用。