javascript - 为什么我可以将 "never"类型分配给任何其他类型?

标签 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 类型,以确保一旦使用类型保护将值彻底缩小到所有可能的类型,您就不会意外使用该值

我很困惑,在默认分支中,我可以将 never 类型分配给任何其他类型,如下所示:

default:
   let value: number = taxValue; // or let value: number = taxValue;        
   console.log(`Unexpected type for value: ${value}`);

那么作者所说的“不能意外使用值”是什么意思呢?在这个例子中,never 的目的是什么,我看不出使用“never”类型有任何好处。

最佳答案

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

never is a subtype of and assignable to every type.

这意味着您不能将never分配给任何其他类型,它是通用源。你不能做的就是将任何内容分配给never:

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

关于javascript - 为什么我可以将 "never"类型分配给任何其他类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58004689/

相关文章:

javascript - 计算一个人的年龄有多少天?

javascript - 从长 HTML 到许多 JPEG(或任何其他图像)

javascript - 自动将某人重定向到另一个网页的最佳方法是什么?

从 typescript 调用 Javascript 原型(prototype)函数

Angular -cli : How to ignore class names from being minified

javascript - JS 移动导航不工作

javascript - 为什么我的图像只在 Debug模式下可见

angular - 克隆对象 TypeScript

typescript - 在 typescript 中使用 never 关键字

angular - BehaviourSubject 的 distinctUntilChanged() 不是函数