使用非空断言有什么意义?

时间:2019-09-16 07:08:21

标签: javascript typescript

我是打字稿新手,我的课本上写着:

仅当您知道不会出现空值时,才应使用非空断言。如果您应用断言,并且会出现空值,则会导致运行时错误。

所以我写了一个简单的打字稿文件来验证(带有“ 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断言有什么意义呢?

2 个答案:

答案 0 :(得分:2)

我猜您误解了类型断言的作用。这不是编译器可以确保的事情,而是您向编译器说的“放弃”,即“我特此放弃对此类型进行检查的权利,我保证在运行时它将为X,如果出现这种情况,我将负责”它不是”。

通过使用!断言,您基本上是在告诉编译器“关闭,我知道更好,这永远不会为空”。编译器别无选择,只能同意您的意见,但是如果您不遵守承诺(您不遵守),那么运行时错误就迫在眉睫。

很显然,类型断言从来都不是一个好主意。最后,Typescript的重点是静态检查您的类型。在将!as放在这里和那里之前,请三思。

答案 1 :(得分:1)

如果使用--strictNullChecks运行编译,则编译错误

error TS2531: Object is possibly 'null'.

应该被提出。我猜想作者打算指出,如果继续使用假定为非空的对象,则非空断言会导致运行时异常。

例如,在上面的示例中使用非空断言在taxValue上调用函数不会警告您该值可能为null,但如果为null,并且您在运行时调用该函数,则会引发一个

可以使用non-null断言消除虚假的警告,即可以将其类型可以为null的knonw-non-null变量当作不可空变量使用。