没有通过类型断言执行类型转换?

时间:2019-09-16 02:39:28

标签: javascript typescript

我是Typescript的新手,只是有关类型断言的问题。

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

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'类型,这就是{{ 1}}可以视为taxNumber的数字,那么为什么不涉及类型转换?

1 个答案:

答案 0 :(得分:2)

  

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

他们指出,当您运行代码时,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);