在TypeScript中never与void有什么区别?
在TypeScript中,never
和 void
是两种特殊的类型,它们有各自独特的用途和含义。
void
类型
void
类型通常用于表示没有返回值的函数。在JavaScript中,如果一个函数没有明确的返回值,它实际上会返回 undefined
。在TypeScript中,我们可以使用 void
类型来表示这种情况。例如:
function logMessage(message: string): void {
console.log(message);
// 这个函数没有返回值,所以它的返回类型是 void
}
注意,虽然 void
类型的函数不能返回任何值,但它们的返回值实际上是 undefined
。这意味着以下代码在TypeScript中是合法的:
const result: void = undefined; // 合法,因为 void 实际上是 undefined 的一个更严格的版本
但是,你不能将 void
类型的变量赋值为除 undefined
之外的其他值。
never
类型
never
类型表示的是那些永远不会有返回值的函数的返回类型。这听起来可能有点抽象,但实际上它非常有用。一个典型的例子是那些总是抛出错误的函数:
function throwError(message: string): never {
throw new Error(message);
// 这个函数永远不会返回,所以它的返回类型是 never
}
因为 throwError
函数总是会抛出一个错误,所以它永远不会返回一个值。这就是我们使用 never
类型的原因。
另一个使用 never
的场景是在类型守卫中,特别是当你有一个永远不会匹配的条件时。例如:
function checkType(value: number | string): string {
if (typeof value === 'number') {
return value.toString();
} else if (typeof value === 'string') {
return value;
} else {
// 这个分支永远不会执行,因为我们已经覆盖了所有可能的类型
// 但为了类型安全,我们可以使用一个 never 类型的返回值来表示这一点
const neverValue: never = ((value: never) => { throw new Error() })(value);
return neverValue; // 这行代码实际上永远不会执行,但它有助于类型检查器理解代码的逻辑结构
}
}
请注意,上面的示例中的最后一个 else
分支实际上永远不会执行,因为我们已经通过前面的条件覆盖了所有可能的类型。但是,通过在该分支中使用一个返回 never
类型的表达式,我们可以向TypeScript的类型检查器提供额外的信息,以帮助它更好地理解代码的逻辑结构。不过在实际开发中,你通常会省略这个永远不会执行的分支,并依赖TypeScript的类型推断来处理这种情况。
总结:
void
类型用于表示没有返回值的函数,这些函数实际上返回undefined
。never
类型用于表示那些永远不会有返回值的函数的返回类型,通常用于总是抛出错误的函数或永远不会执行的代码路径。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!