我现在已经在互联网上搜索了一个关于为什么引入never类型的解释。typescript手册和typescript深入探究了它是什么以及其他一些文章。不过,它们都无法解释为什么要使用never类型以及它解决了什么问题。
大多数示例都显示了代码,编译器已经推断出了never,那么为什么我必须分配类型呢?它能解决什么问题。是“只是”暗示我事后能做些什么(也就是说,什么都不做——这也许足够有用)。编译器使用这些信息的目的是什么?
像往常一样,解释什么和如何能帮助人们做事,但只解释为什么能让他们理解。

最佳答案

never类型是TypeScript从bottom type中的“AA>”的表示。因此,如果你在寻找TypeScript的动机和用途,你可能想研究一下计算机科学中的底层。
通过分析对type theory的评论以及它所涉及的两个问题:the pull request that introduced ita request for a bottom type,可以找到“为什么never被引入typescript”的标准答案。
开发人员的主要用途是为函数(或函数部分)设置一个类型,该类型根本不返回任何值,甚至不返回never。比较这些功能:

function u(): undefined {
    return;
}
const uRet = u();
console.log(typeof uRet); // undefined

function v(): void { }
const vRet = v();
console.log(typeof vRet); // undefined

返回undefined值,具有以下功能:
function throws(): never {
    throw new Error();
}
const tRet = throws();
console.log(typeof tRet); // does not run

function loops(): never {
    while (true) { }
}
const lRet = loops();
console.log(typeof lRet); // does not run

由于异常或无限循环,根本不返回值。undefined类型允许开发人员和编译器对无法运行的代码段进行推理。
never还有其他用途,但我不打算枚举它们,因为您已经知道代码示例。对request to better handle unreachable function returns进行检验,找出never出现的地方是有启发性的。
最后,当你问
大多数示例都显示了代码,编译器已经推断出了never,那么为什么我必须分配类型呢?
请注意,即使在编译器为您推断never的情况下,它在语言中仍然是有用的,即使在编译器推断出never也是有用的情况下也是如此。这似乎是一个不同的问题,即何时可能希望显式地注释类型而不是让编译器推断它们,反之亦然。但这篇文章已经很长了,很可能在其他地方已经有了答案。
希望有帮助,祝你好运!
编辑:程序员使用string有很多原因,尽管许多程序员可能永远不需要使用它。让我列举一些我能想到的原因:
如果您正在为一个javascript库编写类型,其中一个函数抛出异常而不是返回,那么如果没有never,您就无法真正做到这一点。
当编译器不能推断泛型类型参数时,默认为never。它有点“打开失败”,因为{}与(几乎)所有值都兼容。有些情况下,您希望它“失败关闭”,并使它与无值兼容。可以使用{}作为默认参数。
任何类型的neverT的并就是neverTT的交就是never。这些规则(除此之外)允许开发人员构建相当复杂的类型函数,如果没有never,它们将更难或不可能。例如,这里是never
type Diff<T extends string, U extends string> =
  ({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T];

它是一个类型函数,它接受字符串文字Diff<T,U>和字符串文字[cc]的联合,并返回在T中不存在于U中的所有值的联合。
除其他外,您可以使用它从类型中删除属性:
type Foo = { a: string, b: number, c: boolean };
type FooWithoutB = Pick<Foo, Diff<keyof Foo, 'b'>>;
// equivalent to { a: string, c: boolean }

有点像数学中的零。你不需要它;许多文化在没有零概念的情况下相处得很好。但是它非常有用,可以让你很容易地表达那些原本会很麻烦或不可能的想法。
希望这更有说服力?不管怎样,祝你好运。

关于typescript - 为什么在TypeScript中引入了“从不”类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49219531/

10-11 11:38