类型断言不执行类型转换?



我是打字稿的新手,只是一个关于类型断言的问题。

以下是我的教科书中的一个例子:

function calculateTax(amount: number, format: boolean): string | number {
const calcAmount = amount * 1.2;
return format ? `$${calcAmount.toFixed(2)}` : calcAmount;
}
let taxNumber: string | number = calculateTax(100, false);
let taxString: string | number = calculateTax(100, true);

书中说:

类型断言不执行任何类型转换,它只告诉编译器为了进行类型检查,它应该将什么类型应用于值。所以它们等同于这些陈述

let taxNumber: number = calculateTax(100, false) as number;
let taxString: string = calculateTax(100, true) as string;

我很困惑,所以calculateTax(100, false)string | number,当我们通过将数字附加到它来进行断言时,calculateTax(100, false) as number变成了"nu,ber"类型,这就是taxNumber可以被视为let taxNumber: number数字的方式,那么为什么不涉及类型转换?

那么为什么不涉及类型转换呢?

他们指出,当你运行代码时,javascript代码返回的任何内容都是它返回的内容。做as number不会改变代码的行为,它只是告诉打字稿"我比你更了解,所以不要在这里检查我的类型"的一种方式。

如果你真的比打字稿更了解,那么类型断言是可以的。但是如果你犯了一个错误(例如,如果你说它是一个数字,而它不是(,你的代码中就会有一个打字稿无法告诉你的错误。

顺便说一下,你可以通过使用重载在这个函数上做更安全的类型:

function calculateTax(amount: number, format: true): string;
function calculateTax(amount: number, format: false): number;
function calculateTax(amount: number, format: boolean): string | number {
const calcAmount = amount * 1.2;
return format ? `$${calcAmount.toFixed(2)}` : calcAmount;
}
let taxNumber: number = calculateTax(100, false);
let taxString: string = calculateTax(100, true);

相关内容

最新更新