《Effective Typescript》中文第二版
提升 TypeScript 的 83 条具体方法
原书作者:Dan Vanderkam 📚
第 1 章:认识 TypeScript
- 📝 第 1 条: 理解 TypeScript 与 JavaScript 的关系
- 📝 第 2 条: 了解你正在使用哪些 TypeScript 配置项
- 📝 第 3 条: 理解代码生成与类型系统是相互独立的
- 📝 第 4 条: 熟悉结构化类型
- 📝 第 5 条: 限制
any
类型的使用
第 2 章:TypeScript 的类型系统
- 📝 第 6 条: 使用编辑器来查询和探索类型系统
- 📝 第 7 条: 把类型看作值的集合
- 📝 第 8 条: 了解符号处于类型空间还是值空间
- 📝 第 9 条: 优先使用类型注解而非类型断言
- 📝 第 10 条: 避免使用对象包装类型(String, Number, Boolean, Symbol, BigInt)
- 📝 第 11 条: 区分多余属性检查与类型检查
- 📝 第 12 条: 尽可能为整个函数表达式应用类型
- 📝 第 13 条: 了解
type
与interface
的区别 - 📝 第 14 条: 使用
readonly
防止因可变性引发的错误 - 📝 第 15 条: 利用类型运算和泛型减少重复
- 📝 第 16 条: 优先使用更精确的索引签名替代方案
- 📝 第 17 条: 避免数字索引签名
第 3 章:类型推断与控制流分析
- 📝 第 18 条: 避免在代码中添加可推断的类型
- 📝 第 19 条: 不同类型使用不同变量
- 📝 第 20 条: 理解变量如何获得类型
- 📝 第 21 条: 一次性创建对象
- 📝 第 22 条: 理解类型收窄
- 📝 第 23 条: 保持别名使用的一致性
- 📝 第 24 条: 理解上下文在类型推断中的作用
- 📝 第 25 条: 理解类型演变
- 📝 第 26 条: 使用函数式写法和函数式库来帮助类型推导
- 📝 第 27 条: 使用 async 函数替代回调以改善类型推导
- 📝 第 28 条: 用类和柯里化创建新的类型推断点
第 4 章:类型设计
- 📝 第 29 条: 尽量让你的类型只能表示合法的状态
- 📝 第 30 条: 对输入要宽松,对输出要严格
- 📝 第 31 条: 不要在文档中重复类型信息
- 📝 第 32 条: 避免在类型别名中包含
null
或undefined
- 📝 第 33 条: 把
null
值留在类型的外层 - 📝 第 34 条: 优先使用接口的联合类型,而不是属性为联合类型的接口
- 📝 第 35 条: 使用更精确的替代方案代替字符串类型
- 📝 第 36 条: 为特殊值使用独立类型
- 📝 第 37 条: 限制可选属性的使用
- 📝 第 38 条: 避免重复的同类型参数
- 📝 第 39 条: 优先统一类型,而非建模差异
- 📝 第 40 条: 不精确的类型优于不准确的类型
- 📝 第 41 条: 使用领域语言为类型命名
- 📝 第 42 条: 避免基于个人经验数据的类型
第 5 章:类型的不安全性与 any
类型
- 📝 第 43 条: 使用最小的作用域来限制
any
类型 - 📝 第 44 条: 优先使用更精确的
any
替代方案,而不是简单的any
- 📝 第 45 条: 在类型良好的函数中隐藏不安全的类型断言
- 📝 第 46 条: 对于未知类型的值,使用
unknown
替代any
- 📝 第 47 条: 优先采用类型安全的方法来进行猴子补丁
- 📝 第 48 条: 避免类型安全性陷阱
- 📝 第 49 条: 跟踪类型覆盖率,防止类型安全性回归
第 6 章:泛型与类型层级编程
- 📝 第 50 条: 将泛型视为类型之间的函数
- 📝 第 51 条: 避免不必要的类型参数
- 📝 第 52 条: 优先使用条件类型而非重载签名
- 📝 第 53 条: 了解如何控制条件类型中的联合分布
- 📝 第 54 条: 使用模板字面量类型来建模领域特定语言(DSL)及字符串之间的关系
- 📝 第 55 条: 为你的类型编写测试
- 📝 第 56 条: 注意类型的显示方式
- 📝 第 57 条: 优先使用尾递归泛型类型
- 📝 第 58 条: 将代码生成作为复杂类型的替代方案
第 7 章:TypeScript 配方
- 📝 第 59 条: 使用
never
类型进行穷举检查 - 📝 第 60 条: 了解如何遍历对象
- 📝 第 61 条: 使用
Record
类型保持值的同步 - 📝 第 62 条: 使用 Rest 参数和元组类型来建模可变参数函数
- 📝 第 63 条: 使用可选的
never
属性来建模独占或 - 📝 第 64 条: 考虑使用品牌进行命名类型
第 8 章:类型声明与 @types
- 📝 第 65 条: 将 TypeScript 和
@types
放入devDependencies
- 📝 第 66 条: 理解类型声明中涉及的三种版本
- 📝 第 67 条: 导出所有出现在公共 API 中的类型
- 📝 第 68 条: 使用 TSDoc 进行 API 注释
- 📝 第 69 条: 如果回调函数的 API 中包含
this
,为其提供类型 - 📝 第 70 条: 镜像类型以解耦依赖关系
- 📝 第 71 条: 使用模块增强改善类型
第 9 章:编写与运行代码
- 📝 第 72 条: 优先使用 ECMAScript 特性而非 TypeScript 特性
- 📝 第 73 条: 使用源映射调试 TypeScript
- 📝 第 74 条: 了解如何在运行时重构类型
- 📝 第 75 条: 理解 DOM 层级结构
- 📝 第 76 条: 创建准确的环境模型
- 📝 第 77 条: 了解类型检查与单元测试之间的关系
- 📝 第 78 条: 关注编译器性能