简述TypeScript 的 never type 是什么,什么时候用?
在TypeScript中,never
类型表示那些永远不会发生的值的类型。它是一个非常独特和特殊的类型,主要用于两个场景:不可能有返回值的函数,以及永远不可能被执行到的代码路径。
什么是never
类型?
never
类型是TypeScript的一个高级类型,用来表示那些永远不存在的值的类型。换句话说,如果一个表达式或变量被类型化为never
,那么这意味着这个表达式将永远不会成功地返回或者变量将永远不会被赋值。
never
类型的使用场景
- 不可能返回的函数:当一个函数因抛出异常或无限循环而无法正常结束时,该函数的返回类型可以被认为是
never
。这告诉编译器和开发者这个函数不会有返回值。
function throwError(errorMsg: string): never {
throw new Error(errorMsg);
}
function infiniteLoop(): never {
while (true) {
}
}
- 绝不可能的类型检查:在类型保护或类型断言的场景中,
never
类型可以用来确保所有可能的情况都被检查或处理了。如果有未被覆盖的情况,TypeScript会抛出一个错误。
type Shape = Circle | Square;
// 假设Circle和Square都是一些类型
function getArea(shape: Shape): number {
switch (shape.kind) {
case "circle": return Math.PI * shape.radius ** 2;
case "square": return shape.sideLength ** 2;
default: const _exhaustiveCheck: never = shape;
return _exhaustiveCheck;
}
}
在这个例子中,_exhaustiveCheck
变量的类型为never
,这确保了switch
语句已经穷尽了Shape
类型的所有可能值。如果Shape
类型新增了其他形状,没有在switch
语句中处理,TypeScript编译器会报错,因为_exhaustiveCheck
变量无法被赋予一个never
以外的类型。
总结
never
类型在TypeScript中是一个强大的特性,用于处理那些理论上不可能发生的情况。它有助于增强代码的类型安全性,通过确保函数不会意外地返回,或所有的条件分支都被正确处理。正确使用never
类型可以帮助开发者更清晰地表达代码的意图,并利用TypeScript编译器进行更严格的类型检查。