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

4 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)!;
Run Code Online (Sandbox Code Playgroud)

以下是我的问题:

Q1-我们可以看到calculateTax(0, false)会返回null,在我运行程序之后,根本没有运行时错误?为什么作者说会出现运行时错误?

Q2-我可以将没有非空断言的语句重写为:

let taxValue: string | number = calculateTax(0, false);
Run Code Online (Sandbox Code Playgroud)

它没有编译错误和运行时错误,工作完美,那么使用非空断言有什么意义呢?

geo*_*org 13

我猜您误解了类型断言的作用。这不是编译器确保的东西,这是一种“弃权”,你给编译器说“我特此放弃检查此类型的权利,我保证它在运行时将是 X,并且我对后果负责,如果它不是”。

通过使用!断言,您基本上是在告诉编译器“闭嘴,我更清楚,这永远不会为空”。编译器别无选择,只能同意你的观点,但如果你不信守承诺(你确实没有这样做),运行时错误就迫在眉睫。

显然,类型断言几乎从来都不是一个好主意。最后,Typescript 的重点是静态检查你的类型。!在放置或放在这里和那里之前要三思而后行as