我是打字稿的新手,只是一个关于类型断言的问题。
以下是我的教科书中的一个例子:
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);