gpt4 book ai didi

typescript - 为什么在 TypeScript 中引入 `never` 类型?

转载 作者:搜寻专家 更新时间:2023-10-30 20:42:04 25 4
gpt4 key购买 nike

我现在已经在互联网上搜索了为什么引入 never 类型的解释。 TypeScript 手册和 TypeScript Deep Dive 都解释了它是什么以及其他一些文章。但是,它们都没有解释为什么要使用 never 类型以及它解决的问题。大多数示例显示代码,其中编译器已经推断出 never,那么为什么我必须分配类型?它解决什么。是否“只是”向智能感知发出我之后可以做什么的信号(即什么都不做——这可能足够有用)。编译器使用这些信息做什么?一如既往,解释“什么”和“如何”可能会帮助人们做事,但只有“为什么”才能让他们理解。

最佳答案

never type 是 bottom type 的 TypeScript 表示来自 type theory .因此,如果您正在寻找 never 的动机和用途在 TypeScript 中,您可能希望了解计算机科学中的底层类型。


“为什么将 never 引入 TypeScript”的规范答案可能最好通过分析对 the pull request that introduced it 的评论找到以及它解决的两个问题:a request for a bottom type , 和 request to better handle unreachable function returns .

开发人员的主要用途是为函数(或函数的一部分)提供一个类型,它根本不返回任何值,甚至不返回 undefined。 .比较这些功能:

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

由于异常或无限循环,根本不返回值。 never type 允许开发人员和编译器对永远无法运行的代码段进行推理。


never 还有其他用途但我不会尝试列举它们,因为您已经知道代码示例。检查 TypeScript standard library 很有启发性找到never的地方出现。


最后,当你问

Most of the examples show code, where the compiler already infers never, so why do I have to assign the type?

请注意,即使在编译器推断出 never 的情况下对你来说,它以与 string 相同的方式存在于语言中很有用。即使在编译器推断时也是有用的。这似乎是一个不同的问题,关于您何时可能想要显式注释类型而不是让编译器推断它们,反之亦然。但是这篇文章已经很长了,这可能在其他地方得到了回答。

希望对您有所帮助;祝你好运!


编辑:程序员使用 never 的原因有很多,尽管许多程序员可能永远不需要使用它。让我列举一些我能想到的原因:

  • 如果您正在为一个函数抛出异常而不是返回的 JavaScript 库编写类型,那么没有 never 就无法做到这一点。 .

  • 通用类型参数默认为 {}当编译器无法推断出它们时。它有点“无法打开”,因为 {}与(几乎)所有值兼容。在某些情况下,您希望它“失败关闭”并使其与任何值兼容。您可以使用 never作为默认参数。

  • 任何类型的联合Tnever只是T , 和 T 的交集与 nevernever .这些规则(以及其他规则)让开发人员可以构建相当复杂的类型函数,如果没有 never,这些函数将变得更加困难或不可能。 .例如,这里是 Diff<T,U> :

    type Diff<T extends string, U extends string> =
    ({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T];

    这是一个类型函数,接受字符串文字的并集 T和字符串文字的并集 U , 并返回 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 中引入 `never` 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49219531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com