为什么我可以将“从不”类型分配给其他任何类型?

时间:2019-09-19 06:10:43

标签: 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 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}`);

那么,作者“不能偶然使用值”是什么意思?在这个例子中,永不目的是什么,我看不出使用“永不”类型有什么好处。

1 个答案:

答案 0 :(得分:3)

尽管never往往被视为一种错误类型,但事实并非如此。 never是每种类型的子类型,如介绍它的PR所述:

  

never是每种类型的子类型,可以分配给每种类型。

这意味着您可以将never分配给任何其他类型,这是通用来源。您无法做的就是为never分配任何内容:

declare let a:never
let b: string = a;
a = b // error