☰
The Concise TypeScript Book 精讲:深入理解 TypeScript 的 void 类型
2026/9/26 6:29:49 网站建设 项目流程
  • 文档
  • 教程

【免费下载链接】typescript-book

The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.

项目地址:https://gitcode.com/gh_mirrors/typ/typescript-book
点击查看免费下载

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表示"函数会正常结束但不返回任何值"。二者的关键区别:

维度voidnever
含义没有返回值值永远不会产生
函数形态正常返回(隐式返回 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。

五、最佳实践小结

  1. 无返回值函数统一标注: void:让类型系统明确"不要使用返回值",提升可读性;
  2. 不要用void声明"暂未确定"的变量:需要"未定义/未知"语义时,请使用undefined、unknown或null;
  3. 区分void与never:正常结束不返回值用void,永不返回(异常/死循环/不可达分支)用never;
  4. 善用回调中的void放宽:在设计事件回调、迭代器回调等 API 时,用(...) => void作为参数类型可以接受"返回了值但调用方忽略"的实现;
  5. 配合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.

项目地址:https://gitcode.com/gh_mirrors/typ/typescript-book
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询