在 TypeScript 的开发中,never 是一个非常特殊的类型。虽然它似乎没有什么特别的用处,但实际上,正是由于它的特殊用途,使得 TypeScript 中的一些高级类型操作得以实现。本文将详细介绍 never 类型的作用和使用方法。
什么是 never 类型
never 是 TypeScript 的一种特殊类型,表示一个永远不可能出现的值。它是所有类型的子类型,也就是说,任何类型都可以赋值给 never 类型。
never 类型在函数类型中非常有用,可以用来表示不可达代码的情况。比如一个函数中抛出错误的语句,这时候返回的就可以是 never 类型。又比如一个永远无法结束的死循环函数,它也返回的是 never 类型。
如何使用 never 类型
下面通过一些示例代码来说明 never 类型的使用。
示例-1: 抛出错误的函数
function throwError(): never { throw new Error("something wrong!"); }
示例-2: 永远无法结束的函数
function neverEnd(): never { while (true) {} }
示例-3: 类型守卫
TypeScript 中的类型守卫可以用来保证类型的正确性,在某些情况下,当我们的类型守卫都执行完毕之后,就会得到一个从未见过的类型。此时,我们就可以使用 never 类型去处理它。
// javascriptcn.com 代码示例 type UnionType = string | number | boolean; function isString(value: UnionType): value is string { return typeof value === "string"; } function isNumber(value: UnionType): value is number { return typeof value === "number"; } function isBoolean(value: UnionType): value is boolean { return typeof value === "boolean"; } function useUnionType(value: UnionType) { if (isString(value)) { console.log(value.toUpperCase()); } else if (isNumber(value)) { console.log(value.toFixed(2)); } else if (isBoolean(value)) { console.log(value ? "yes" : "no"); } else { const check: never = value; } }
示例-4: 类型推导
never 类型在一些类型推导和类型操作中也非常有用。比如在下面的例子中,使用 never 类型,通过过滤操作来获取一个数组中的 never 类型。
type Diff<T, U> = T extends U ? never : T; type Filter<T, U> = T extends U ? never : T; type Data = string | number | boolean | never[] | null; type Result = Filter<Data, never[]>; // never[]
示例-5: 写一个全面的类型保护函数
在写一些高级的 TypeScript 程序时,可能会需要写一些全面的类型保护函数。这时候,我们就可以使用 never 类型来强制要求编译器对每一种情况都有覆盖。
// javascriptcn.com 代码示例 type ValueTypes = string | number | boolean | null | undefined; function isNull(value: ValueTypes): value is null { return value === null; } function isUndefined(value: ValueTypes): value is undefined { return value === undefined; } function isEmptyObject(value: ValueTypes): value is {} { return typeof value === "object" && value !== null && Object.keys(value).length === 0; } function isValueTypes<T extends ValueTypes>(value: T): value is T { if (isNull(value) || isUndefined(value)) { return true; } else if (isEmptyObject(value)) { return true; } else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { return true; } const check: never = value; return false; }
总结
never 类型在 TypeScript 中是非常重要的,它可以用来表示一些不可能发生的情况。在函数类型、类型推导以及类型守卫中,never 类型都有着非常重要的使用场景。希望本文对读者们有所帮助,让大家更好的理解 never 类型的使用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652c91df7d4982a6ebe3daa5