前言:
在 TypeScript 中,void 和 never 是两个常用的类型。虽然它们都表示某种特定的类型,但它们之间有明显的区别。
void 类型
void 类型表示函数没有返回值,或者说该函数返回的值为 undefined。在其他编程语言中,也有类似的概念,比如 Java 中的 void 关键字。在 TypeScript 中,可以使用 void 来标注函数的返回值类型,以确保该函数不会返回任何值。
function sayHello(): void {
console.log("Hello TypeScript");
}
在上面的例子中,sayHello 函数不显式返回值,因此它的返回类型被标注为 void。实际上,你也可以显式地使用 return 关键字返回 undefined。
function sayHello(): void {
console.log("Hello TypeScript");
return undefined;
}
never 类型
never 类型表示那些永远不会发生的类型。这意味着,该类型的变量不能有任何值。在实际开发中,never 类型通常用于抛出异常、处理永远不会结束的循环或者类型推断中的缺省分支。一个返回 never 类型的函数必须是无法正常返回的,比如直接抛出异常。
function throwError(message: string): never {
throw new Error(message);
}
在上面的例子中,throwError 函数显式地声明了返回类型为 never。当这个函数被调用时,它会抛出一个异常并终止当前的代码执行。
void 和 never 的区别
void 和 never 之间的最显著的区别在于,在编写代码时,可以将任意类型的值分配给 void 类型的变量,但不能将任何值分配给 never 类型的变量。
let value: void;
value = undefined; // 可以分配 undefined 或 null
value = null;
let neverValue: never;
// neverValue = 123; // 编译错误,无法分配其他类型的值
// neverValue = undefined;
// neverValue = null;
此外,void 类型只能作为函数的返回值类型,而 never 类型还可以作为变量的类型。因为 never 类型的变量不能有任何值,所以在实际中很少直接定义变量为 never 类型,而是通过某些特定的条件或上下文推断得出该变量的推断类型为 never。
总而言之,void 是一种表示函数没有返回值的类型,而 never 是表示永远不会有返回值的类型。无论是用来标注函数的返回类型还是定义变量的类型,它们的使用场景和含义都有所不同。