- 文档
- 教程
【免费下载链接】typescript-book
The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.
void是 TypeScript 内置类型体系中最容易被误读的类型之一。它表示"一个函数不返回任何值",常用于函数返回类型标注;但很多人会把它与undefined、null甚至never混为一谈。本文以《The Concise TypeScript Book》的 void 类型章节 为骨架,结合该开源仓库中 类型系统探索章节、内置类型原语 与 never 类型章节 的源码级论述,系统讲清void的语义、赋值规则、与undefined/never的边界,以及在实际代码中的正确用法。读完本文,你将能够准确标注无返回值函数、读懂回调函数中的void返回类型,并避开void相关的常见类型错误。
一、void的核心语义:表示"没有返回值"
按原文档的定义:void类型用于表示一个函数不返回任何值。这与 JavaScript 中void运算符(void 0得到undefined)的含义不同,TypeScript 中的void是一个独立的类型原语。
原文档给出的最小示例:
const sayHello = (): void => { console.log('Hello!'); };这里sayHello的返回类型被标注为void,说明调用方不应依赖它的返回值。即使函数体末尾隐式返回undefined,从类型系统角度看它依然属于void。
该章节在仓库中隶属于 内置类型原语 所描述的类型体系:
void: Represents the absence of any type. It is commonly used as the return type of functions that do not return a value.
也就是说,void描述的是"任何类型的缺失",这与never("永远不会发生的值")形成鲜明对比——这两者在 目录 中被排为第 47 与 48 章,属于相邻对照的两个主题。
二、void的赋值规则与可赋值性边界
很多人以为void就是undefined,其实二者在可赋值性上存在微妙差异。仓库中的 探索类型系统 一章给出了明确的规则:
let g: void; let g1: any; g = 1; // Invalid,void 除了 any 之外不接受任何类型的赋值 g = g1; // Valid,any 可以赋值给 void由此可以总结出void的可赋值性边界:
- 没有任何具体值可以赋给
void变量(void变量只能保持undefined状态); - 只有
any类型可以赋给void; - 反过来,
void变量赋值给number等其他类型同样非法。
同章节还专门提示了与严格空值检查(strictNullChecks)的联动:
当启用
strictNullChecks时,null和undefined的处理方式类似于void;否则它们的行为类似于never。
这句话揭示了void、null、undefined、never在同一类型系统下的位置关系,也是面试与工程实践中常见的考察点。
三、void与undefined、never的边界辨析
3.1void与undefined
- 语义角度:
undefined表示"一个值尚未被赋值或尚未被定义";void表示"没有值这一概念",通常只作为函数返回类型出现。 - 可赋值性角度:在
strictNullChecks开启时,二者处理方式相近,但严格来说void更"空"——一个void类型的变量甚至不能接收显式的undefined以外的常规赋值。
3.2void与never
对照仓库中的 never 类型章节:
const infiniteLoop = (): never => { while (true) { // do something } }; const throwError = (message: string): never => { throw new Error(message); };never表示"永远不会有返回值的函数或表达式"(无限循环、抛异常),而void表示"函数会正常结束但不返回任何值"。二者的关键区别:
| 维度 | void | never |
|---|---|---|
| 含义 | 没有返回值 | 值永远不会产生 |
| 函数形态 | 正常返回(隐式返回 undefined) | 无限循环 / 抛异常,永远走不到返回 |
| 典型用途 | 声明无返回值函数、回调签名 | 穷尽性检查、不可达分支标注 |
void与never还经常搭配使用。在 never 类型章节 的穷尽性检查示例中,一个switch分支函数本身标注为void返回,而default分支使用never承接不可达的联合成员:
type Direction = 'up' | 'down'; const move = (direction: Direction): void => { switch (direction) { case 'up': // move up break; case 'down': // move down break; default: const exhaustiveCheck: never = direction; throw new Error(`Unhandled direction: ${exhaustiveCheck}`); } };这是void在实际工程中最常见的搭档场景:外层函数声明"没有返回值",内层用never做编译期的穷尽性校验。
四、工程中的高频使用场景
4.1 类与接口中的方法签名
仓库中的 class.md 大量使用void标注无返回值的实例方法:
public sayHi(): void { ... } public introduce(): void { ... } abstract makeSound(): void;在接口与抽象类中,void作为方法契约,强制所有实现类的方法"不返回任何有意义的值"。
4.2 回调函数与函数类型签名
void常出现在回调、事件处理器和函数类型定义中,例如 typescript-introduction.md 里的动物接口:
interface Animal { bark: () => void; meow: () => void; }这里的关键点是:返回类型为void的函数类型,允许被一个"实际返回了值"的函数实现。这是 TypeScript 在回调场景下对void的特殊放宽——比如forEach的回调类型是(value: T) => void,你传入v => v.length(返回 number)依然合法,因为调用方承诺忽略返回值。这既保证了 API 的灵活性,又避免了误用返回值。
4.3 泛型函数与类型操作工具
- 泛型约束场景:generics.md 中的
const printLen = <T extends { length: number }>(value: T): void => {...},用void声明工具函数无返回值; - 条件类型与工具类型场景:type-manipulation.md 中
type Func = (a: string, b: number) => void;配合Parameters<Func>抽取参数类型,ReturnType<T>也能作用于void返回的函数类型得到void。
五、最佳实践小结
- 无返回值函数统一标注
: void:让类型系统明确"不要使用返回值",提升可读性; - 不要用
void声明"暂未确定"的变量:需要"未定义/未知"语义时,请使用undefined、unknown或null; - 区分
void与never:正常结束不返回值用void,永不返回(异常/死循环/不可达分支)用never; - 善用回调中的
void放宽:在设计事件回调、迭代器回调等 API 时,用(...) => void作为参数类型可以接受"返回了值但调用方忽略"的实现; - 配合
strictNullChecks理解空值语义:开启严格空值检查后,null/undefined与void的处理边界更清晰,也更贴近真实工程配置。
六、相关章节与延伸阅读
void只是 TypeScript 内置类型体系中的一环,建议结合以下仓库章节形成完整认知:
- 内置类型原语:
number、string、boolean、any、void、never等原语的完整定义; - 探索类型系统:可赋值性规则、类型即集合(Sets)的视角,以及
strictNullChecks下的空值语义; - never 类型:与
void成对学习,掌握穷尽性检查模式; - 类型操作:
Parameters<T>、ReturnType<T>等工具类型对void函数类型的处理; - 函数与类:类方法、抽象方法中的
void返回类型实践。
通过将《The Concise TypeScript Book》中零散的void知识点与仓库内多个章节相互印证,你可以从"认识语法"上升到"理解设计意图",在实际项目中写出更严谨、更易维护的类型代码。
- 文档
- 教程
【免费下载链接】typescript-book
The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.
相关推荐
The Concise TypeScript Book 德文版精讲:TypeScript 枚举(Enums)全类型深入剖析
The Concise TypeScript Book 德文版精讲:TypeScript 枚举(Enums)全类型深入剖析 导读:本文以开源仓库 typescr
文档教程The Concise TypeScript Book 精读:深入解析 TypeScript 的原始类型(Primitive Types)
The Concise TypeScript Book 精读:深入解析 TypeScript 的原始类型(Primitive Types) 导读 本文基于开源项
文档教程The Concise TypeScript Book 精讲:深入理解 `never` 类型与穷尽性检查实战
The Concise TypeScript Book 精讲:深入理解 never 类型与穷尽性检查实战 never 是 TypeScript 内置类型中最特殊
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考