06 · 用类型表达设计 · MODULE 06

TypeScript:让大型代码保持可预测

TypeScript 不是给 JavaScript 换一种语法,而是把业务规则变成编译器能检查的契约。你会从类型推断走到判别联合、泛型、类型体操边界和运行时校验。

进阶14 小时8 个核心主题

先用一句白话理解

类型像合同:它不能保证合作方永远诚信,却能提前写清双方必须交付什么。外部 API 仍需验货,也就是运行时校验;不能因为合同写得漂亮就跳过验收。

学完你能做到什么

01

在 strict 模式下为真实业务数据建立清晰模型

02

使用收窄和判别联合消除不可能状态

03

用泛型和类型操作构建可复用但不过度抽象的 API

04

理解 unknown、never、any 和类型断言的正确边界

05

区分编译期类型安全与运行时数据校验

把每个核心概念讲透

不要把知识点当作名词列表。下面每一项都要回到真实项目中回答:它解决什么问题,如何验证,以及在哪些条件下会失效。

01CORE CONCEPT

类型推断、基本类型、对象类型和函数类型

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“把一个含大量 any 的模块迁移到 strict 模式”,记录现象、预期、差异和结论。
02CORE CONCEPT

联合类型、交叉类型、字面量类型与控制流收窄

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“使用判别联合覆盖加载、成功、空数据和失败状态”,记录现象、预期、差异和结论。
03CORE CONCEPT

判别联合、穷尽检查与不可能状态

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“实现一个类型安全的 API Client”,记录现象、预期、差异和结论。
04CORE CONCEPT

泛型、约束、keyof、映射类型与条件类型

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“为公共模块生成声明文件并完成类型测试”,记录现象、预期、差异和结论。
05CORE CONCEPT

模板字面量类型、工具类型与 satisfies

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“把一个含大量 any 的模块迁移到 strict 模式”,记录现象、预期、差异和结论。
06CORE CONCEPT

strict、noUncheckedIndexedAccess 等关键编译选项

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“使用判别联合覆盖加载、成功、空数据和失败状态”,记录现象、预期、差异和结论。
07CORE CONCEPT

模块解析、声明文件、DOM 与第三方库类型

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“实现一个类型安全的 API Client”,记录现象、预期、差异和结论。
08CORE CONCEPT

外部数据的运行时校验和类型测试

先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。

验证方式用 DevTools、自动测试和跨浏览器结果验证假设:完成“为公共模块生成声明文件并完成类型测试”,记录现象、预期、差异和结论。

这一章的学习步骤

1类型推断、基本类型、对象类型和函数类型
2联合类型、交叉类型、字面量类型与控制流收窄
3判别联合、穷尽检查与不可能状态
4泛型、约束、keyof、映射类型与条件类型
5模板字面量类型、工具类型与 satisfies
6strict、noUncheckedIndexedAccess 等关键编译选项
7模块解析、声明文件、DOM 与第三方库类型
8外部数据的运行时校验和类型测试
STEP 01

把一个含大量 any 的模块迁移到 strict 模式

STEP 02

使用判别联合覆盖加载、成功、空数据和失败状态

STEP 03

实现一个类型安全的 API Client

STEP 04

为公共模块生成声明文件并完成类型测试

动手任务

PROJECT BRIEF

将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。

交付清单

  • 严格模式下零类型错误的应用
  • 领域模型和 API 数据模型的边界说明
  • 类型安全的 API Client 与插件示例
  • 无说明 any 清零报告

用判别联合表达请求状态

typescript
type LoadState<T> =
  | { status: "loading" }
  | { status: "success"; data: T }
  | { status: "failure"; message: string };

function describe<T>(state: LoadState<T>): string {
  switch (state.status) {
    case "loading":
      return "正在加载";
    case "success":
      return "加载成功";
    case "failure":
      return "加载失败:" + state.message;
    default: {
      const neverState: never = state;
      return neverState;
    }
  }
}

console.log(describe({ status: "failure", message: "网络不可用" }));

先让它跑起来,再逐行修改。最有效的学习方式,是观察你的改动如何影响结果。

三级练习:从复现到生产

每一级都比上一级少一点提示、多一点约束。只有在不看答案也能完成验收时,知识才真正变成能力。

01
LEVEL 1 · 基础复现

让核心机制第一次跑通

  • 把一个含大量 any 的模块迁移到 strict 模式
  • 使用判别联合覆盖加载、成功、空数据和失败状态
  • 实现一个类型安全的 API Client
  • 为公共模块生成声明文件并完成类型测试
02
LEVEL 2 · 独立改造

改变约束,验证你真的理解

  • 不看教程,独立完成:在 strict 模式下为真实业务数据建立清晰模型
  • 不看教程,独立完成:使用收窄和判别联合消除不可能状态
  • 不看教程,独立完成:用泛型和类型操作构建可复用但不过度抽象的 API
  • 不看教程,独立完成:理解 unknown、never、any 和类型断言的正确边界
  • 不看教程,独立完成:区分编译期类型安全与运行时数据校验
03
LEVEL 3 · 生产挑战

把实验变成能交付的工程

  • 严格模式下零类型错误的应用
  • 领域模型和 API 数据模型的边界说明
  • 类型安全的 API Client 与插件示例
  • 无说明 any 清零报告
  • 检查兼容性、可访问性、性能、安全与渐进增强,并把检查结果写进项目复盘。

最容易踩的坑

01

把 any 当成解决类型错误的快捷键

02

用类型断言假装外部数据已经可靠

03

为了炫技编写团队无法维护的复杂条件类型

04

没有开启 strict,却误以为项目已经类型安全

先回答,再展开参考答案

Q01这一课最核心的业务目标是什么?

TypeScript 不是给 JavaScript 换一种语法,而是把业务规则变成编译器能检查的契约。你会从类型推断走到判别联合、泛型、类型体操边界和运行时校验。

Q02如果只能保留三个验收结果,应该保留什么?

严格模式下零类型错误的应用;领域模型和 API 数据模型的边界说明;类型安全的 API Client 与插件示例

Q03学习过程中最需要主动避免什么?

把 any 当成解决类型错误的快捷键;用类型断言假装外部数据已经可靠;为了炫技编写团队无法维护的复杂条件类型;没有开启 strict,却误以为项目已经类型安全

Q04怎样证明你不是“看懂了”,而是真的会做?

独立完成“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”,并用测试、数据或运行结果逐项验收交付清单。

PRODUCTION READINESS

本课完成检查表

全部能打勾,再进入下一课。

  • 目标明确:在 strict 模式下为真实业务数据建立清晰模型
  • 核心机制已用最小实验验证:把一个含大量 any 的模块迁移到 strict 模式
  • 风险已检查:把 any 当成解决类型错误的快捷键
  • 风险已检查:用类型断言假装外部数据已经可靠
  • 风险已检查:为了炫技编写团队无法维护的复杂条件类型
  • 风险已检查:没有开启 strict,却误以为项目已经类型安全
  • 交付物可复现:严格模式下零类型错误的应用
  • 交付物可复现:领域模型和 API 数据模型的边界说明
  • 交付物可复现:类型安全的 API Client 与插件示例
  • 交付物可复现:无说明 any 清零报告

继续深入的官方资料

课程版本基线:2026 年 7 月。涉及版本号时,以链接中的官方文档为最终依据。