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