目录
前言 .1
第1 章 了解TypeScript 11
条款1:理解 TypeScript 与 JavaScript 的关系 11
要记住的事情 18
条款2:知道你在使用哪个 TypeScript 选项 18
要记住的事情 22
条款3:理解代码的生成是独立于类型的 . 22
类型错误的代码仍会产生输出 23
你无法在运行时检查 TypeScript 类型 24
类型操作不能影响运行时的值 26
运行时类型可能与声明类型不一样 . 27
你不能基于 TypeScript 类型来重载一个函数 . 28
TypeScript 类型对运行时的性能没有影响 29
要记住的事情 30
条款4:习惯结构类型(Structural Typing). 30
要记住的事情 35
条款5:限制使用any 类型 35
any 类型没有类型安全 36
any 类型会让你打破契约 36
any 类型没有语言服务 37
any 类型会掩盖重构代码时的错误 38
any 类型遮蔽了你的类型设计 . 39
any 类型破坏了你对类型系统的信心 40
要记住的事情 40
第2 章 TypeScript 的类型系统 41
条款6:使用你的编辑器来询问和探索类型系统 41
要记住的事情 46
条款7:将类型视为价值的集合 . 46
要记住的事情 53
条款8:知道如何分辨符号是类型空间还是值空间 . 54
要记住的事情 60
条款9:优先选择类型声明而不是类型断言 60
要记住的事情 64
条款10:避免对象包装类(String,Number,Boolean,Symbol,BigInt) 64
要记住的事情 68
条款11:认识额外属性检查的局限性 . 68
要记住的事情 72
条款12:尽可能将类型应用于整个函数表达式 . 72
要记住的事情 75
条款13:了解类型(type)和接口(interface)的区别 75
要记住的事情 81
条款14:使用类型操作和泛型来避免重复自己的工作 81
要记住的事情 90
条款15:为动态数据使用索引签名 . 91
要记住的事情 95
条款16:优先选择 Array、Tuple 和 ArrayLike,而不是数字索引签名. 95
要记住的事情 99
条款17:使用 readonly 避免值变(Mutation)相关的错误. 99
要记住的事情 107
条款18:使用映射类型来保持值的同步 . 107
要记住的事情 110
第3 章 类型推断 111
条款19:避免你的代码被可推断类型弄得混乱不堪 112
要记住的事情 119
条款20:不同的类型使用不同的变量 119
要记住的事情 122
条款21:理解类型扩展 122
要记住的事情 126
条款22:理解类型收缩 127
要记住的事情 130
条款23:一次性构建对象 131
要记住的事情 134
条款24:在使用别名时要保持一致 134
要记住的事情 138
条款25:使用async 函数代替异步代码的回调 138
要记住的事情 144
条款26:了解类型推断中如何使用上下文 144
元组类型 . 146
对象 148
回调 148
要记住的事情 149
条款27:使用函数式构造和库来帮助类型流转 150
要记住的事情 155
第4 章 类型设计 156
条款28:倾向选择总是代表有效状态的类型 156
要记住的事情 162
条款29:宽进严出 163
要记住的事情 166
条款30:不要在文档中重复类型信息 167
要记住的事情 169
条款31:将空值推到你的类型边界上 169
要记住的事情 173
条款32:优选接口的联合,而不是联合的接口 173
要记住的事情 177
条款33:选择更精确的字符串类型的替代类型 178
要记住的事情 182
条款34:宁愿选择不完整的类型,也不选择不准确的类型 . 183
要记住的事情 187
条款35:从 API 和规范而不是从数据中生成类型 . 188
要记住的事情 194
条款36:使用你的问题域语言命名类型 . 194
要记住的事情 197
条款37:考虑加“烙印”来实现名义类型 197
要记住的事情 201
第5 章 和 Any 一起工作. 202
条款38:为 Any 类型使用最窄的范围 . 202
要记住的事情 205
条款39:比起普通的 any,选择更精确的 any 变体 . 205
要记住的事情 207
条款40:在类型良好的函数中隐藏不安全的类型断言 207
要记住的事情 210
条款41:理解 any 演变 210
要记住的事情 214
条款42:对未知类型的值使用 unknown 而不是 any 214
要记住的事情 218
条款43:选择类型安全的方法而不是猴子补丁 218
要记住的事情 221
条款44:追踪你的类型覆盖率以防止类型安全中的回归问题 221
要记住的事情 224
第6 章 类型声明和 @types 225
条款45:把 TypeScript 和 @types 放在 devDependencies 中 225
要记住的事情 227
条款46:了解类型声明中涉及的三个版本 228
要记住的事情 232
条款47:导出所有出现在公有 API 中的类型 232
要记住的事情 233
条款48:使用 TSDoc 来编写 API 注释 234
要记住的事情 237
条款49:提供回调中 this 的类型 237
要记住的事情 242
条款50:优先选择条件类型,而不是重载声明 242
要记住的事情 245
条款51:反映类型以切断依赖 . 245
要记住的事情 246
条款52:警惕测试类型时的陷阱 247
要记住的事情 252
第7 章 编写和运行你的代码 . 253
条款53:使用 ECMAScript 特性,而非 TypeScript 特性 253
枚举 254
参数属性 . 256
命名空间和三斜线导入 258
装饰器 258
要记住的事情 259
条款54:了解如何迭代对象 259
要记住的事情 262
条款55:了解 DOM 的层次结构 . 262
要记住的事情 269
条款56:不要依赖私有访问修饰符(private) 来隐藏信息 269
要记住的事情 272
条款57:使用 Source Maps 来调试 TypeScript 272
要记住的事情 276
第8 章 迁移到TypeScript . 277
条款58:编写现代 JavaScript 278
使用 ECMAScript 模块 279
使用类而不是原型 . 279
使用 let/const 代替 var . 281
使用 for-of 或数组方法代替 for(;;) 282
优先选择箭头函数而不是函数表达式 282
使用对象字面量的简写形式和解构赋值 . 283
使用默认函数参数 . 285
使用 async/await 代替原始的 Promise 或 Callback 286
不要把 use strict 放在 TypeScript 中 . 287
要记住的事情 288
条款59:使用 @ts-check 和 JSDoc 来尝试 TypeScript 288
未声明的全局变量 . 289
未知的库 . 289
DOM 问题 290
不准确的 JSDoc 291
要记住的事情 293
条款60:通过 allowJs 混合使用 TypeScript、JavaScript 293
要记住的事情 295
条款61:将模块逐个转换到依赖关系图上 295
未声明的类成员 296
类型不断变化的值 . 298
要记住的事情 300
条款62:在启用 noImplicitAny 之前,不要认为迁移已经完成 . 301
要记住的事情 302