WHY IT MATTERS
先用一句白话理解
类型像合同:它不能保证合作方永远诚信,却能提前写清双方必须交付什么。外部 API 仍需验货,也就是运行时校验;不能因为合同写得漂亮就跳过验收。
LEARNING OUTCOMES
学完你能做到什么
在 strict 模式下为真实业务数据建立清晰模型
使用收窄和判别联合消除不可能状态
用泛型和类型操作构建可复用但不过度抽象的 API
理解 unknown、never、any 和类型断言的正确边界
区分编译期类型安全与运行时数据校验
CONCEPT DEEP DIVE
把每个核心概念讲透
不要把知识点当作名词列表。下面每一项都要回到真实项目中回答:它解决什么问题,如何验证,以及在哪些条件下会失效。
类型推断、基本类型、对象类型和函数类型
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
联合类型、交叉类型、字面量类型与控制流收窄
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
判别联合、穷尽检查与不可能状态
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
泛型、约束、keyof、映射类型与条件类型
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
模板字面量类型、工具类型与 satisfies
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
strict、noUncheckedIndexedAccess 等关键编译选项
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
模块解析、声明文件、DOM 与第三方库类型
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
外部数据的运行时校验和类型测试
先在浏览器中观察结构、样式、事件、网络和渲染行为。把这个概念放回“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”中,回答它解决了什么问题、依赖哪些输入、会在哪些边界失效。
CONCEPT MAP
这一章的学习步骤
把一个含大量 any 的模块迁移到 strict 模式
使用判别联合覆盖加载、成功、空数据和失败状态
实现一个类型安全的 API Client
为公共模块生成声明文件并完成类型测试
HANDS-ON PROJECT
动手任务
将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。
交付清单
- ✓严格模式下零类型错误的应用
- ✓领域模型和 API 数据模型的边界说明
- ✓类型安全的 API Client 与插件示例
- ✓无说明 any 清零报告
MINIMUM RUNNABLE CODE
用判别联合表达请求状态
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: "网络不可用" }));先让它跑起来,再逐行修改。最有效的学习方式,是观察你的改动如何影响结果。
DELIBERATE PRACTICE
三级练习:从复现到生产
每一级都比上一级少一点提示、多一点约束。只有在不看答案也能完成验收时,知识才真正变成能力。
让核心机制第一次跑通
- 把一个含大量 any 的模块迁移到 strict 模式
- 使用判别联合覆盖加载、成功、空数据和失败状态
- 实现一个类型安全的 API Client
- 为公共模块生成声明文件并完成类型测试
改变约束,验证你真的理解
- 不看教程,独立完成:在 strict 模式下为真实业务数据建立清晰模型
- 不看教程,独立完成:使用收窄和判别联合消除不可能状态
- 不看教程,独立完成:用泛型和类型操作构建可复用但不过度抽象的 API
- 不看教程,独立完成:理解 unknown、never、any 和类型断言的正确边界
- 不看教程,独立完成:区分编译期类型安全与运行时数据校验
把实验变成能交付的工程
- 严格模式下零类型错误的应用
- 领域模型和 API 数据模型的边界说明
- 类型安全的 API Client 与插件示例
- 无说明 any 清零报告
- 检查兼容性、可访问性、性能、安全与渐进增强,并把检查结果写进项目复盘。
COMMON PITFALLS
最容易踩的坑
把 any 当成解决类型错误的快捷键
用类型断言假装外部数据已经可靠
为了炫技编写团队无法维护的复杂条件类型
没有开启 strict,却误以为项目已经类型安全
SELF CHECK
先回答,再展开参考答案
Q01这一课最核心的业务目标是什么?+
TypeScript 不是给 JavaScript 换一种语法,而是把业务规则变成编译器能检查的契约。你会从类型推断走到判别联合、泛型、类型体操边界和运行时校验。
Q02如果只能保留三个验收结果,应该保留什么?+
严格模式下零类型错误的应用;领域模型和 API 数据模型的边界说明;类型安全的 API Client 与插件示例
Q03学习过程中最需要主动避免什么?+
把 any 当成解决类型错误的快捷键;用类型断言假装外部数据已经可靠;为了炫技编写团队无法维护的复杂条件类型;没有开启 strict,却误以为项目已经类型安全
Q04怎样证明你不是“看懂了”,而是真的会做?+
独立完成“将任务看板完整迁移到严格 TypeScript,再设计类型安全的数据客户端、事件总线与插件协议;所有外部输入先校验后进入领域模型。”,并用测试、数据或运行结果逐项验收交付清单。
本课完成检查表
全部能打勾,再进入下一课。
- □目标明确:在 strict 模式下为真实业务数据建立清晰模型
- □核心机制已用最小实验验证:把一个含大量 any 的模块迁移到 strict 模式
- □风险已检查:把 any 当成解决类型错误的快捷键
- □风险已检查:用类型断言假装外部数据已经可靠
- □风险已检查:为了炫技编写团队无法维护的复杂条件类型
- □风险已检查:没有开启 strict,却误以为项目已经类型安全
- □交付物可复现:严格模式下零类型错误的应用
- □交付物可复现:领域模型和 API 数据模型的边界说明
- □交付物可复现:类型安全的 API Client 与插件示例
- □交付物可复现:无说明 any 清零报告
PRIMARY SOURCES
继续深入的官方资料
课程版本基线:2026 年 7 月。涉及版本号时,以链接中的官方文档为最终依据。