
🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
文章目录
在TypeScript中,never类型是一种特殊的类型,它有着独特的用途和特点。深入理解never类型对于编写严谨、高质量的TypeScript代码至关重要。以下将从never类型的定义、使用场景、与其他类型的关系等方面进行详细介绍。

一、never类型的定义
never类型表示那些永远不会出现的值的类型。它是TypeScript类型系统中的底层类型,也可以看作是所有类型的子类型。也就是说,never类型的值可以赋值给任何其他类型,但任何其他类型的值都不能赋值给never类型,除了undefined和null(在严格模式下,undefined和null也不能赋值给never类型)。
二、never类型的使用场景

(一)函数返回值
当一个函数永远不会返回正常的值时,它的返回值类型可以被定义为never。例如,一个总是抛出异常的函数:
typescript
function throwError(message: string): never {
throw new Error(message);
}
在这个例子中,throwError函数通过抛出异常来终止程序的执行,它不会有正常的返回值,所以其返回值类型被定义为never。
又如,一个无限循环的函数:
typescript
function infiniteLoop(): never {
while (true) {
// 这里是无限循环的代码
}
}
由于infiniteLoop函数会一直执行下去,不会有返回结果,因此它的返回值类型也是never。
(二)联合类型的排除
never类型在联合类型的排除中也有重要作用。当我们从一个联合类型中排除所有可能的成员时,剩下的就是never类型。例如:
typescript
type T1 = string | number;
type T2 = Exclude<T1, string | number>; // T2的类型为never
这里使用Exclude工具类型从T1联合类型中排除了所有的成员,所以T2的类型就是never。
(三)类型保护
在类型保护中,never类型可以帮助我们确保代码的安全性。例如,在一个switch语句中,当我们对一个联合类型进行穷举判断后,default分支的类型就是never,这表示不存在其他可能的情况。
typescript
type Shape = 'circle' | 'square' | 'triangle';
function drawShape(shape: Shape) {
switch (shape) {
case 'circle':
// 绘制圆形的代码
break;
case 'square':
// 绘制正方形的代码
break;
case 'triangle':
// 绘制三角形的代码
break;
default:
const exhaustiveCheck: never = shape; // 这里的exhaustiveCheck类型为never
break;
}
}
如果在Shape联合类型中添加了新的成员,而switch语句没有相应地更新,那么default分支的类型就不再是never,这会导致编译错误,提醒开发者需要处理新的情况,从而保证了代码的完整性和安全性。
三、never类型与其他类型的关系
(一)与void类型的区别
void类型表示没有任何类型,通常用于函数没有返回值的情况。而never类型表示永远不会有值。虽然在某些情况下,函数返回void和返回never看起来相似,但它们有着本质的区别。void类型的函数可以正常结束执行,而never类型的函数永远不会正常结束执行。例如:
typescript
function printMessage(): void {
console.log('Hello, World!');
}
function errorMessage(): never {
throw new Error('An error occurred.');
}
printMessage函数执行完打印操作后会正常结束,返回void;而errorMessage函数会抛出异常,永远不会正常结束,返回never。
(二)与其他基本类型的关系
never类型与其他基本类型(如number、string、boolean等)没有直接的继承或包含关系。它是一个独立的特殊类型,用于表示一种特殊的语义,即不存在的值。但如前文所述,never类型的值可以赋值给其他任何类型,这是因为never类型表示的是一种不可能出现的情况,所以可以将其视为任何类型的子类型。
四、总结

never类型在TypeScript中是一个非常特殊且有用的类型,它主要用于表示那些永远不会出现的值或情况。通过合理地使用never类型,我们可以在函数返回值、联合类型处理和类型保护等方面提高代码的可读性、可维护性和安全性。理解never类型与其他类型的区别和关系,能够帮助开发者更好地利用TypeScript的类型系统,编写出更加健壮的代码。在实际开发中,要根据具体的业务需求和代码逻辑,准确地运用never类型,以充分发挥TypeScript的强大功能。