Skip to content

序章

第一阶段:理解 TS 是如何“工作”的

  • 类型系统基础
  • 为什么写代码时能提前发现错误?
  • any 到底能不能用?
  • 变量还没赋值,怎么就有类型了?
  • 类型推断与兼容性
  • 为什么函数参数少一个也能通过?
  • 对象多了属性为什么报错?
  • string 能赋给 number 吗?
  • 编译流程与配置
  • .ts 文件怎么变成 .js
  • tsconfig.json 到底控制了什么?
  • 为什么有些错误不报,有些却报了?

第二阶段:构建类型安全的代码结构

  • 复合类型与高级类型
  • 如何描述一个复杂的对象结构?
  • 怎么让类型“动态”变化?
  • 联合类型和交叉类型有什么区别?
  • 泛型
  • 为什么 Array<T> 能支持任意类型?
  • 函数怎么做到“类型参数化”?
  • T extends U 是什么意思?
  • 模块与命名空间
  • import typeimport 有什么区别?
  • 命名空间还能用吗?
  • 类型怎么做到按需引入?

第三阶段:掌握类型编程能力

  • 条件类型与类型守卫
  • 类型也能“if判断”吗?
  • instanceofin 怎么影响类型?
  • 为什么函数能“缩小”类型?
  • 工具类型深入
  • Partial<T> 是怎么实现的?
  • 如何让某些属性必选或只读?
  • 怎么从类型中提取一部分?
  • 类型体操
  • 能不能让类型自动推导嵌套属性?
  • 如何实现类型递归?
  • 字符串字面量类型能操作吗?

第四阶段:工程化与类型设计

  • 声明文件与类型扩展
  • 第三方 JS 库怎么加类型?
  • 全局变量如何声明?
  • 怎么给模块扩展类型?
  • 类型安全的 API 设计
  • 怎么让 API 用错就报错?
  • 如何设计“链式调用”的类型?
  • 可选配置项怎么避免误配?
  • 类型兼容性与演进
  • 升级 TS 版本为什么报错?
  • 如何平稳迁移 any 到强类型?
  • 类型断言到底安不安全?

第五阶段:深入框架与类型元编程

  • 泛型约束与高级推导
  • Vueref 为什么能自动解包?
  • ReactuseState 怎么推导初始值类型?
  • 如何实现类型级别的“逻辑判断”?
  • 装饰器与元数据
  • 类装饰器怎么修改类结构?
  • 如何在运行时读取类型信息?
  • reflect-metadata 怎么配合 TS 使用?
  • 类型检查插件与 LSP
  • 能不能自定义类型规则?
  • 编辑器提示是怎么来的?
  • 如何提升大型项目的类型性能?