序章
第一阶段:理解 TS 是如何“工作”的
- 类型系统基础
- 为什么写代码时能提前发现错误?
any到底能不能用?- 变量还没赋值,怎么就有类型了?
- 类型推断与兼容性
- 为什么函数参数少一个也能通过?
- 对象多了属性为什么报错?
string能赋给number吗?- 编译流程与配置
.ts文件怎么变成.js?tsconfig.json到底控制了什么?- 为什么有些错误不报,有些却报了?
第二阶段:构建类型安全的代码结构
- 复合类型与高级类型
- 如何描述一个复杂的对象结构?
- 怎么让类型“动态”变化?
- 联合类型和交叉类型有什么区别?
- 泛型
- 为什么
Array<T>能支持任意类型? - 函数怎么做到“类型参数化”?
T extends U是什么意思?- 模块与命名空间
import type和import有什么区别?- 命名空间还能用吗?
- 类型怎么做到按需引入?
第三阶段:掌握类型编程能力
- 条件类型与类型守卫
- 类型也能“if判断”吗?
instanceof和in怎么影响类型?- 为什么函数能“缩小”类型?
- 工具类型深入
Partial<T>是怎么实现的?- 如何让某些属性必选或只读?
- 怎么从类型中提取一部分?
- 类型体操
- 能不能让类型自动推导嵌套属性?
- 如何实现类型递归?
- 字符串字面量类型能操作吗?
第四阶段:工程化与类型设计
- 声明文件与类型扩展
- 第三方
JS库怎么加类型? - 全局变量如何声明?
- 怎么给模块扩展类型?
- 类型安全的
API设计 - 怎么让
API用错就报错? - 如何设计“链式调用”的类型?
- 可选配置项怎么避免误配?
- 类型兼容性与演进
- 升级
TS版本为什么报错? - 如何平稳迁移
any到强类型? - 类型断言到底安不安全?
第五阶段:深入框架与类型元编程
- 泛型约束与高级推导
Vue的ref为什么能自动解包?React的useState怎么推导初始值类型?- 如何实现类型级别的“逻辑判断”?
- 装饰器与元数据
- 类装饰器怎么修改类结构?
- 如何在运行时读取类型信息?
reflect-metadata怎么配合TS使用?- 类型检查插件与
LSP - 能不能自定义类型规则?
- 编辑器提示是怎么来的?
- 如何提升大型项目的类型性能?