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
类型,您在向编译器撒谎。