Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我可以分配;决不;输入到任何其他类型?_Javascript_Typescript - Fatal编程技术网

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()
是有效的。在TS
myVar
中,会有
never
类型,因为它永远不会被真正分配<如果类型保护排除了所有其他有效类型,则代码>从不
也可能发生。例如,我可能需要在上下文中查看它以更好地理解它,但作者似乎表示
taxValue
将属于
从不
类型,因为它既不是数字也不是字符串-它通过了两种类型的保护并取消了
string | number
联合的两个成员的资格,所以您将一无所获。手动声明
let value:never
没有多大意义-它是一个不应该存在且不应该使用的变量声明。
never
意味着它永远不会出现。它适用于语法允许您获取变量但实际上不应获取变量的情况,例如
函数alwaysThrows(){throw“some error”}
永远不会返回任何内容,但是在语法上,使用
var myVar=alwaysThrows()
是有效的。在TS
myVar
中,会有
never
类型,因为它永远不会被真正分配<如果类型保护排除了所有其他有效类型,则代码>从不
也可能发生。例如,我可能需要在上下文中查看它以更好地理解它,但作者似乎表示
taxValue
将属于
从不
类型,因为它既不是数字也不是字符串-它通过了两种类型的保护并取消了
string | number
联合的两个成员的资格,所以您将一无所获。手动声明
let value:never
没有多大意义-它是一个不应该存在且不应该使用的变量声明。因此,您能否提供一个示例来说明使用never type的好处,我看不出使用它的任何理由that@secondimage
从不
表示一种类型,根据类型系统,不能在运行时发生,只是类型本身不是自动错误。即使在您的示例中,赋值
let value:never=taxValuetaxValue
未缩小到
never
(即遗忘案例),则code>将失败。但是,您仍然希望能够使用后续的
控制台记录无效值。log
,ts需要允许您这样做。因此,您可以将
never
指定为日志函数的参数,或将其连接到字符串中,即使类型系统认为这不会真正发生。因此,您能否提供一个示例来说明使用never type的好处,我看不出有任何理由使用它that@secondimage
从不
表示一种类型,根据类型系统,不能在运行时发生,只是类型本身不是自动错误。即使在您的示例中,赋值
let value:never=taxValuetaxValue
未缩小到
never
(即遗忘案例),则code>将失败。但是,您仍然希望能够使用后续的
控制台记录无效值。log
,ts需要允许您这样做。因此,您可以将
never
指定为日志函数的参数,或者将其连接到字符串中,即使类型系统认为它不会真正发生。