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

Javascript 类型断言不执行类型转换?,javascript,typescript,Javascript,Typescript,我不熟悉类型脚本,只是关于类型断言的一个问题 下面是我课本上的一个例子: function calculateTax(amount: number, format: boolean): string | number { const calcAmount = amount * 1.2; return format ? `$${calcAmount.toFixed(2)}` : calcAmount; } let taxNumber: string | number = calcul

我不熟悉类型脚本,只是关于类型断言的一个问题

下面是我课本上的一个例子:

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;
<>我混淆了,所以<代码> CaltAtEthax(100,false)<代码>是代码>字符串编号< /代码>,当我们通过将其附加到数字上进行断言时,<代码> CaltuaTax(100,false)作为数字< /代码>变成“Nu,BER”类型,这就是<代码>税号>代码>可以被看作是编号>代码>编号:编号<代码>那么为什么不涉及类型转换呢

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

他们指出,当您运行代码时,javascript代码返回的内容就是它返回的内容。作为数字执行
不会改变代码的行为,它只是告诉typescript“我比你知道得多,所以不要在这里检查我的类型”

如果您确实比typescript更清楚,那么类型断言就可以了。但是如果你犯了一个错误(例如,如果你说它是一个数字而不是),你的代码中就会有一个typescript无法告诉你的错误

顺便说一下,您可以使用重载在此函数上执行更安全的类型:

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);
那么为什么不涉及类型转换呢

他们指出,当您运行代码时,javascript代码返回的内容就是它返回的内容。作为数字执行
不会改变代码的行为,它只是告诉typescript“我比你知道得多,所以不要在这里检查我的类型”

如果您确实比typescript更清楚,那么类型断言就可以了。但是如果你犯了一个错误(例如,如果你说它是一个数字而不是),你的代码中就会有一个typescript无法告诉你的错误

顺便说一下,您可以使用重载在此函数上执行更安全的类型:

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);

类型断言是告诉编译器值的类型;它根本没有运行时效果。如果您将
foo=(Math.random()<0?:a:1)写入字符串
,则在运行时不会将
foo
转换为
字符串
;你在向编译器撒谎,说什么类型的
foo
将在运行时出现;它根本没有运行时效果。如果您将
foo=(Math.random()<0?:a:1)写入字符串
,则在运行时不会将
foo
转换为
字符串
;关于运行时的
foo
类型,您在向编译器撒谎。