TypeScript:never vs void

TypeScript 中的 never 和 void 两个关键词在类型系统中扮演着重要的角色,但是它们之间的区别常常让人感到困惑。
void:什么都没有
让我们先来了解一下 void 这个关键词。在 TypeScript 中,void 表示一个函数没有返回值,或者说函数返回值的类型是空的。如果一个函数被标注为 void,那么它在执行完毕后不会返回任何值。
让我们通过一个简单的例子来说明 void 的用法:
function sayHello(): void {
console.log("Hello!");
}
const result: void = sayHello();
console.log(result); // 输出:undefined
在上面的例子中,我们定义了一个 sayHello 函数,它不返回任何值(即 void)。当我们调用这个函数时,它会打印出 "Hello!",但是由于函数没有返回值,所以 result 的值是 undefined。
需要注意的是,我们可以将 void 类型赋值给其他类型的变量,但是反过来是不行的。这是因为 void 表示缺少值,它没有实际的值可以赋给其他类型。
never:永远不会返回
接下来,让我们来了解一下 never 这个关键词。在 TypeScript 中,never 表示一个函数永远不会返回。这意味着当一个函数被标注为 never 类型时,它要么会抛出一个异常,要么会进入一个无限循环,永远不会结束。
下面是一个使用 never 的例子:
function throwError(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {
// 无限循环
}
}
在上面的例子中,throwError 函数抛出一个带有指定错误消息的异常。由于函数在抛出异常后不会继续执行,因此它的返回类型被标注为 never。
而 infiniteLoop 函数则展示了一个无限循环的例子,它永远不会结束。这也是 never 类型的另一种常见用法。
需要注意的是,由于 never 表示函数永远不会返回,因此我们不能将 never 类型赋值给其他类型的变量,因为其他类型都有可能有实际的返回值。
区别对比
现在我们来总结一下 never 和 void 之间的区别。
void表示函数没有返回值,或者说返回值类型是空的。never表示函数永远不会返回,要么抛出异常,要么进入无限循环。
简而言之,void 是函数可能有返回值但实际上没有返回值,而 never 则是函数根本不会有返回值。
实际应用场景
在实际的开发中,void 和 never 经常用于不同的场景。下面我将介绍一些常见的应用场景,帮助大家更好地理解它们的用途。
void 的应用场景
- 在 JavaScript 中,大多数函数都没有显式的返回值,因此在 TypeScript 中将它们标注为
void类型是很常见的。 - 当一个函数没有返回值,但是我们希望它执行完毕后进行一些副作用操作(比如打印日志、修改全局状态等)时,可以将其返回类型标注为
void。
never 的应用场景
- 在处理错误和异常情况时,我们常常会使用
never类型。比如当一个函数遇到无法恢复的错误时,我们可以使用never类型来表示函数会抛出异常。 - 当一个函数进入无限循环,或者是一个递归函数永远不会终止时,可以将其返回类型标注为
never。
下面是一个使用 never 处理错误的例子:
function handleError(error: string): never {
console.error("Error:", error);
throw new Error(error);
}
try {
// 执行一些可能抛出异常的操作
} catch (error) {
handleError("Something went wrong!");
}
在上面的例子中,我们定义了一个 handleError 函数来处理错误。它首先会打印出错误消息,然后抛出一个带有错误消息的异常。由于函数抛出异常后不会继续执行,因此它的返回类型被标注为 never。
总结
void表示函数没有返回值,或者说返回值类型是空的。never表示函数永远不会返回,要么抛出异常,要么进入无限循环。void用于标注函数没有实际返回值的情况,而never用于表示函数根本不会有返回值。
示例代码仅用于说明概念,可能不符合最佳实践。在实际开发中,请根据具体情况进行调整。
转载自:https://juejin.cn/post/7245541931752489018