在 TypeScript 中,void
和 never
是两种不同的类型,用于表示不同的场景。以下是它们的详细解释和区别:
一、void
类型
定义 :
void
表示没有任何返回值的类型,常用于函数返回值类型注解。
使用场景:
-
函数不返回值:
javascriptfunction logMessage(message: string): void { console.log(message); // 没有显式 return 或 return undefined }
-
可选属性:
javascriptinterface Config { onSuccess?: () => void; // 可选回调,返回值为 void }
-
泛型约束:
javascripttype Callback<T = void> = (arg: T) => void;
二、never
类型
定义 :
never
表示永远不会出现的值的类型,常用于以下场景:
-
函数永远不会返回(抛出异常或无限循环):
javascriptfunction throwError(message: string): never { throw new Error(message); } function infiniteLoop(): never { while (true) {} }
-
不可能存在的类型(如永不为真的条件分支):
javascripttype Shape = Circle | Square; function getArea(shape: Shape): number { switch (shape.kind) { case "circle": return Math.PI * shape.radius ** 2; case "square": return shape.sideLength ** 2; default: const _exhaustiveCheck: never = shape; // 确保所有情况都被处理 return _exhaustiveCheck; } }
三、核心区别对比
特性 | void | never |
---|---|---|
含义 | 表示 "没有值"(常用于无返回值的函数) | 表示 "永远不会出现的值" |
可赋值性 | 只能赋值为 undefined (非严格模式下还可赋值为 null ) |
不能赋值给任何类型(除了自身) |
可被赋值 | 可以被 undefined 和 null 赋值(非严格模式) |
任何类型都不能赋值给 never |
典型场景 | 函数无返回值 | 抛出异常、无限循环、类型保护 |
四、示例对比
1. 函数返回值
javascript
// void
function greet(): void {
console.log("Hello!");
// 默认返回 undefined
}
// never
function fail(): never {
throw new Error("Failed!");
}
2. 类型兼容性
javascript
let v: void = undefined; // 合法
let n: never = undefined; // 错误:不能将 undefined 赋值给 never
// 错误:不能将 never 赋值给其他类型(除了 never 自身)
let num: number = fail(); // 错误
五、常见问题
1. void 和 undefined 的区别
void
是一种类型,表示 "没有返回值"。undefined
是一个实际的值,用于表示变量未被赋值或函数没有显式返回。
2. 何时使用 never
- 当函数永远不会正常结束时(如抛出异常、无限循环)。
- 在类型守卫中确保所有情况都被处理(如示例中的
_exhaustiveCheck
)。
3. never 的实际应用
javascript
// 类型守卫
function assertIsString(value: unknown): asserts value is string {
if (typeof value !== "string") {
throw new Error("Not a string!"); // 返回 never
}
}
// 工具类型
type NonNullable<T> = T extends null | undefined ? never : T;
六、总结
void
:用于表示函数没有返回值,或变量可能为undefined
。never
:用于表示永远不会发生的情况,如异常抛出、无限循环或类型系统中的穷尽检查。
理解两者的区别有助于编写更精确的类型定义和更健壮的代码。