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 taxValue = calculateTax(100, false); switch (typeof tax
function calculateTax(amount: number, format: boolean): string | number {
const calcAmount = amount * 1.2;
return format ? `$${calcAmount.toFixed(2)}` : calcAmount;
}
let taxValue = calculateTax(100, false);
switch (typeof taxValue) {
case "number":
console.log(`Number Value: ${taxValue.toFixed(2)}`);
break;
case "string":
console.log(`String Value: ${taxValue.charAt(0)}`);
break;
default:
let value: never = taxValue; // taxValue's type is "never"
console.log(`Unexpected type for value: ${value}`);
}
作者说:
TypeScript提供了“从不”类型,以确保在使用类型保护将值彻底缩小到所有可能的类型后,不会意外使用值
我很困惑,在默认分支中,我可以将never类型分配给任何其他类型,如下所示:
default:
let value: number = taxValue; // or let value: number = taxValue;
console.log(`Unexpected type for value: ${value}`);
那么作者所说的“不能意外使用值”是什么意思呢?在这个例子中,我看不出使用“从不”类型有什么好处。尽管
从不
往往被视为一种错误类型,但事实并非如此never
是每种类型的子类型,如介绍中所述:
从不
是每种类型的子类型,可分配给每种类型
这意味着您可以将从不分配给任何其他类型,它是一个通用源。您不能将任何内容分配给从不:
declare let a:never
let b: string = a;
a = b // error
虽然never
往往被视为一种错误类型,但事实并非如此never
是每种类型的子类型,如介绍中所述:
从不
是每种类型的子类型,可分配给每种类型
这意味着您可以将从不分配给任何其他类型,它是一个通用源。您不能将任何内容分配给从不:
declare let a:never
let b: string = a;
a = b // error
从不
意味着它永远不会出现。它适用于语法允许您获取变量但实际上不应获取变量的情况,例如函数alwaysThrows(){throw“some error”}
永远不会返回任何内容,但是在语法上,使用var myVar=alwaysThrows()
是有效的。在TSmyVar
中,会有never
类型,因为它永远不会被真正分配<如果类型保护排除了所有其他有效类型,则代码>从不
也可能发生。例如,我可能需要在上下文中查看它以更好地理解它,但作者似乎表示taxValue
将属于从不
类型,因为它既不是数字也不是字符串-它通过了两种类型的保护并取消了string | number
联合的两个成员的资格,所以您将一无所获。手动声明let value:never
没有多大意义-它是一个不应该存在且不应该使用的变量声明。never
意味着它永远不会出现。它适用于语法允许您获取变量但实际上不应获取变量的情况,例如函数alwaysThrows(){throw“some error”}
永远不会返回任何内容,但是在语法上,使用var myVar=alwaysThrows()
是有效的。在TSmyVar
中,会有never
类型,因为它永远不会被真正分配<如果类型保护排除了所有其他有效类型,则代码>从不
也可能发生。例如,我可能需要在上下文中查看它以更好地理解它,但作者似乎表示taxValue
将属于从不
类型,因为它既不是数字也不是字符串-它通过了两种类型的保护并取消了string | number
联合的两个成员的资格,所以您将一无所获。手动声明let value:never
没有多大意义-它是一个不应该存在且不应该使用的变量声明。因此,您能否提供一个示例来说明使用never type的好处,我看不出使用它的任何理由that@secondimage从不
表示一种类型,根据类型系统,不能在运行时发生,只是类型本身不是自动错误。即使在您的示例中,赋值let value:never=taxValue如果taxValue
未缩小到never
(即遗忘案例),则code>将失败。但是,您仍然希望能够使用后续的控制台记录无效值。log
,ts需要允许您这样做。因此,您可以将never
指定为日志函数的参数,或将其连接到字符串中,即使类型系统认为这不会真正发生。因此,您能否提供一个示例来说明使用never type的好处,我看不出有任何理由使用它that@secondimage从不
表示一种类型,根据类型系统,不能在运行时发生,只是类型本身不是自动错误。即使在您的示例中,赋值let value:never=taxValue如果taxValue
未缩小到never
(即遗忘案例),则code>将失败。但是,您仍然希望能够使用后续的控制台记录无效值。log
,ts需要允许您这样做。因此,您可以将never
指定为日志函数的参数,或者将其连接到字符串中,即使类型系统认为它不会真正发生。