TypeScript 是一种静态类型的 JavaScript 超集,它提供了许多强大的工具来帮助开发者更好地编写可维护、可扩展的代码。其中一个非常有用的类型是 never
类型,本文将介绍 never
类型的使用技巧,并提供一些示例代码帮助读者更好地理解这个类型。
什么是 never
类型
never
类型表示那些永远不会发生的值的类型。它通常用于描述那些抛出异常或者无限循环的函数的返回值类型。例如:
function throwError(message: string): never { throw new Error(message); } function infiniteLoop(): never { while (true) {} }
上面的 throwError
函数会抛出一个异常,然后终止程序的执行,因此它的返回值类型是 never
。而 infiniteLoop
函数则是一个无限循环,它永远不会返回,因此它的返回值类型也是 never
。
never
类型的使用技巧
1. 辅助类型
never
类型可以用于定义一些辅助类型。例如,我们可以使用 never
类型来定义一个类型,它表示除了某些特定的值之外,其他的所有值都是无效的:
type InvalidValue<T> = T extends string | number ? never : T;
上面的代码定义了一个泛型类型 InvalidValue<T>
,它接受一个类型参数 T
,并返回一个新的类型。如果 T
是 string
或 number
类型,则返回 never
类型,否则返回 T
。
我们可以使用这个类型来定义一个只能接受布尔值的函数:
function onlyAcceptBoolean(value: InvalidValue<boolean>) { // ... } onlyAcceptBoolean(true); // OK onlyAcceptBoolean(false); // OK onlyAcceptBoolean(1); // Error: Argument of type '1' is not assignable to parameter of type 'never'.
上面的代码中,onlyAcceptBoolean
函数只接受布尔值作为参数,如果传递其他类型的值,编译器会报错。
2. 类型守卫
never
类型可以用于类型守卫,帮助我们在编译时检查代码的正确性。例如,我们可以使用 never
类型来定义一个函数,它接受一个联合类型的参数,并根据参数的类型来执行不同的操作:
-- -------------------- ---- ------- -------- ------------------ ------ - ------- - -- ------- ----- --- --------- - -- --- - ---- -- ------- ----- --- --------- - -- --- - ---- - ----- ----------------- ----- - ------ - -展开代码
上面的代码中,我们使用了一个 _exhaustiveCheck
变量来占据 never
类型,这样如果 value
的类型不是 string
或者 number
,编译器就会报错。
3. 类型推断
never
类型还可以用于类型推断,帮助我们在编写复杂的函数时自动推断返回值类型。例如,我们可以使用 never
类型来定义一个函数,它接受一个数组作为参数,并返回数组中的最后一个元素:
function getLastItem<T extends any[]>(items: T): T extends [...infer _, infer L] ? L : never { return items[items.length - 1] as any; }
上面的代码中,我们使用了一个条件类型来判断数组的类型,并根据结果返回不同的类型。如果数组的类型是 T extends [...infer _, infer L]
,则返回 L
类型,否则返回 never
类型。
我们可以使用这个函数来获取一个数组的最后一个元素,并自动推断返回值的类型:
const arr1 = [1, 2, 3] as const; const arr2 = ["a", "b", "c"] as const; const last1 = getLastItem(arr1); // type: 3 const last2 = getLastItem(arr2); // type: "c"
上面的代码中,我们使用了 as const
来告诉编译器这是一个只读数组,这样就可以自动推断出返回值的类型了。
结语
never
类型是 TypeScript 中非常有用的一个类型,它可以帮助我们编写更加可靠、健壮的代码。本文介绍了 never
类型的使用技巧,并提供了一些示例代码帮助读者更好地理解这个类型。希望本文能够对读者有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6785ccfb5638eae96013bde3