TypeScript 中的 `never` 类型详解

阅读时长 3 分钟读完

TypeScript 中的 never 类型是一个特殊的类型,它表示从不会出现的值。never 的使用场景相对较少,但是在某些情况下却能够大显神威,让我们来深入探究一下。

never 的基本用法

首先,我们来看一个简单的例子:

这里定义了一个函数 throwError,它的返回值是 never 类型,也就是说,在调用该函数后,程序将永远停止执行。原因很简单,throw 语句抛出了一个错误,这个错误会一直向上层抛出,最终导致程序中断。

never 的高级用法

虽然 never 几乎没有实际返回值,但它可以在类型系统中发挥重要作用,比如当类型检查器无法完全推断出一个表达式的类型时,我们可以使用 never 类型来进行辅助。

考虑一个例子,假设我们有两个类型:

我们现在要实现一个函数,根据输入的类型返回不同的对象。具体实现如下:

-- -------------------- ---- -------
-------- -------------- ------- ----- - ------------ --- - ------- ----- - --- - --- -
    -- ----- --- ------ -
        ------ - ----- ----- - -- - ------- ----- - --- - ------
    - ---- -- ----- --- ------ -
        ------ - ----- ------ ------------ -- - -- - ------- ----- - --- - ------
    - ---- -
        ----- --- -------------- ---- ----------
    -
-

这个函数看起来有点复杂,但是它的实现思路并不难理解。我们使用了条件类型 T extends "foo" ? Foo : Bar 来表示函数的返回值类型,其中 extends 关键字用于类型推断。

注意到上述代码中有两处 never 类型的使用,分别在 { prop: "foo" } as T extends "foo" ? Foo : never{ prop: "bar", anotherProp: 42 } as T extends "bar" ? Bar : never 中。这样做的作用是让 TypeScript 在类型检查时能够更好地推断出表达式的类型。

总结

从上面的例子可以看到,虽然 never 类型在实际开发中的使用场景相对较少,但是在某些特定的情况下能够帮助我们更好地编写类型安全、且易于维护的代码。因此,在需要的时候,务必要掌握 never 类型的相关知识,以充分利用 TypeScript 的优秀的类型系统。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6502232095b1f8cacdf91753

纠错
反馈