- • never 表示永不存在的值
- • 抛出异常和无限循环的函数返回 never
- • 利用 never 进行类型守卫的全面性检查
- • never 是所有类型的子类型
2.7 never 类型
表示永不存在的值的类型
🎯 学习目标
- 理解 never 类型的含义
- 掌握 never 的使用场景
- 学会利用 never 进行类型检查
- 了解 never 与 void 的区别
📚 never 类型定义
never 类型表示永不存在的值的类型。它是所有类型的子类型,但没有类型是 never 的子类型。
// never 是所有类型的子类型
let neverVar: never;
let num: number = neverVar; // OK
let str: string = neverVar; // OK
let bool: boolean = neverVar; // OK
// 但没有类型可以赋值给 never
neverVar = 123; // Error
neverVar = 'hello'; // Error
neverVar = true; // Error
💻 使用场景
1. 永不返回的函数
// 抛出异常的函数
function throwError(message: string): never {
throw new Error(message);
}
// 无限循环
function infiniteLoop(): never {
while (true) {
// 永不退出
}
}
2. 类型守卫的全面性检查
type Shape = 'circle' | 'square' | 'triangle';
function getArea(shape: Shape): number {
switch (shape) {
case 'circle':
return Math.PI * 1 * 1;
case 'square':
return 1 * 1;
case 'triangle':
return 0.5 * 1 * 1;
default:
// 如果未来添加新形状但没有处理,
// 这里会产生编译错误,提醒你补充处理
const _exhaustiveCheck: never = shape;
return _exhaustiveCheck;
}
}
🔍 类型收窄与 never
function process(value: string | number) {
if (typeof value === 'string') {
console.log(value.toUpperCase());
} else if (typeof value === 'number') {
console.log(value.toFixed(2));
} else {
// 这里 value 的类型是 never
// 因为 string | number 已经被完全处理了
const _exhaustive: never = value;
}
}
📊 void vs never
| 特性 | void | never |
|---|---|---|
| 含义 | 无返回值 | 永不返回 |
| 函数执行 | 正常结束 | 不会结束 |
| 可赋值性 | 可接受 undefined | 不能接受任何值 |
| 使用场景 | 普通无返回函数 | 异常、无限循环、类型检查 |
📝 本节小结
✅