内容简介
TypeScript作为JavaScript的类型化超集,以其独特禀赋化解了JavaScript诸多为人诟病的痼疾。然而,其学习门槛颇为陡峭,唯有经年累月的实践方能洞悉个中奥妙。《Effective TypeScript精进TypeScript代码的83个实践方法》承袭《Effective C++》与《Effective Java》的经典范式,以务实风格呈现了83条精要准则,于进退取舍间勾勒出驾驭这门语言的智慧图谱。
《Effective TypeScript精进TypeScript代码的83个实践方法》作者通过详尽的实例演示,让每一条建议都蕴含着实战的气息。无论你是初窥门径的新手,还是已有根基的中阶开发人员,《Effective TypeScript精进TypeScript代码的83个实践方法》都将引领你突破TypeScript的认知边界,蜕变为深谙其道的语言大师。
新版内容特别针对TypeScript5进行了重构,增补了类型级编程和TypeScript指南两大篇章。
解析TypeScript类型系统的运作机理,领会核心精髓。
善用类型推断,以最简注解构筑周全的类型防护壁垒。
精研类型设计之道,铸就安全性与可读性兼具的代码基底。
活用泛型与类型级编程,建模复杂接口模型。
解析依赖关系与声明文件,驾驭模块化工程的隐秘脉络。
制定JavaScript向TypeScript的渐进迁移方略,实现工程的平稳演进。
目录
前言 1
第一版前言 13
第1章 认识TypeScript 17
条款1:TypeScript与JavaScript 18
条款2:了解常用的编译选项 25
条款3:代码生成独立于类型 30
条款4:结构类型的自由度 39
条款5:使用any要慎重 44
第2章 TypeScript的类型系统 51
条款6:借助编辑器探索类型世界 51
条款7:值的集合即类型 58
条款8:类型空间与值空间 67
条款9:类型注解胜于类型断言 74
条款10:避免使用对象类型(String、Number、Boolean、Symbol、BigInt) 79
条款11:多余属性检查和类型检查 83
条款12:函数整体声明类型更安全 88
条款13:type别名与interface 93
条款14:使用readonly守护不可变值 101
条款15:类型操作配泛型,避免重复造轮子 108
条款16:类型要精准,索引签名请慎用 120
条款17:慎用数字索引签名 126
第3章 类型推断与控制流分析 131
条款18:避免类型冗余,保持代码整洁 132
条款19:类型专属,变量分立 141
条款20:类型能溯源,推断全了解 144
条款21:对象整装,一次性构造 151
条款22:认识类型收窄 154
条款23:别名要使用,类型得一致 160
条款24:以上下文为基础,类型推导有根有据 164
条款25:类型演变,时刻了解 170
条款26:函数式构建引航,类型贯通流转 175
条款27:async取代回调,类型流转更畅通 180
条款28:类与柯里化并举,新建类型推断点 186
第4章 类型设计 193
条款29:类型即契约,状态需有效 193
条款30:宽进严出,契约必守 200
条款31:类型勿繁,注释需简 205
条款32:类型别名切勿包含null或undefined 208
条款33:空值需在类型之外 209
条款34:接口组合胜过属性组合
条款35:类型精确优先,慎用字符串 219
条款36:特殊值要有独立类型 224
条款37:慎用可选属性 228
条款38:同类型参数不传两次 233
条款39:统一类型胜过细微差异建模 235
条款40:不完全精确的类型胜过不准确的类型 238
条款41:以专业领域语言来命名类型
条款42:孤例不证 247
第5章 非健全性与any类型 255
条款43:压缩any的作用域 255
条款44:更精确的any变体胜过any本身 259
条款45:在签名正确的函数内部隐藏不安全类型断言 262
条款46:类型未知,unknown胜过any 267
条款47:类型安全的方法胜过猴子补丁 272
条款48:规避健全性陷阱
条款49:跟踪类型覆盖率,避免类型安全回退 289
第6章 泛型与类型级编程 293
条款50:视泛型为类型间的函数 294
条款51:避免非必要的类型参数 301
条款52:条件类型胜过重载签名 308
条款53:控制条件类型在联合类型上的分布 313
条款54:使用模板字面量类型建模DSL和字符串之间的关系 319
条款55:类型也要测试 326
条款56:优化类型的展示方式 337
条款57:泛型也要尾递归 342
条款58:自动代码生成胜过手写复杂类型 347
第7章 TypeScript指南 353
条款59:使用Never类型进行类型穷举检查 353
条款60:遍历对象 361
条款61:使用Record类型保持值的同步 365
条款62:使用剩余参数和元组类型来建模可变参数函数 369
条款63:使用可选的never属性来建模异或关系 372
条款64:使用Brand构建名义类型 376
第8章 类型声明和@types 381
条款65:将TypeScript和@types放在devDependencies中 381
条款66:理解类型声明中的三个版本 384
条款67:导出所有出现在公共API中的类型 389
条款68:使用TSDoc注释API 390
条款69:如果this是API的一部分,请在回调中为其指定类型 394
条款70:使用镜像类型断开依赖关系 399
条款71:使用模块增强来改善类型 402
第9章 编写和运行代码 409
条款72:与Typescript相比,ECMAScript更胜一筹 409
条款73:使用源码映射调试TypeScript 418
条款74:了解运行时类型的重组 426
条款75:理解DOM的层级关系 432
条款76:根据环境创建精确的模型 439
条款77:理解类型检查和单元测试之间的关系 442
条款78:关注编译器的性能 447
第10章 现代化与迁移 457
条款79:编写现代化的JavaScript 458
条款80:使用@ts-check和JSDoc试验TypeScript 463
条款81:使用al
前言/序言
难以置信,本书的第一版出版至今已经将近五年了。这本书及其配套网站都受到了广泛好评,并帮助了无数开发者加深对TypeScript的理解,提高他们的实际应用能力。
令我惊讶的是,仅仅六个月后,就有人问我这本书是否已经过时了!考虑到第一版出版前几年TypeScript的迅猛发展,当时我的确也在担忧。因此,我尽量避免在书中加入可能很快会过时的内容,更关注于那些具有长期价值的主题,比如语言基础和程序设计,而不是具体的库或框架。从整体来看,第一版的大部分内容至今仍然适用。
随着TypeScript的发展和新功能的加入,尽管第一版的内容并没有被淘汰,但在覆盖范围上显得有所不足。要撰写一本关于“Effective”的书籍,仅仅知道某个功能如何运作是不够的,还需要有丰富的实践经验,才能判断哪些模式行之有效,哪些模式无法长期适用。例如,在2019年,条件类型(conditionaltypes)才刚刚被引入,因此我当时对它们的应用经验有限。而在这一版中,这部分内容得到了更深入的探讨。此外,模板字面量类型(template literaltypes)是过去几年里TypeScript增加的最重要的功能之一,它极大地拓展了类型系统的可能性,这在条款54中得到了详细介绍。
此外,得益于“Type Challenges”等项目,TypeScript开发者在类型系统中的探索变得更加大胆。泛型(generics)和类型级编程(type-level programming)在第一版中仅有轻描淡写地提及,在这一版中,它们拥有了完整的一章(即第6章)。
自从我第一次尝试TypeScript以来,已经过去了八年多的时间。我依然乐在其中,每当阅读最新的版本说明,或看到AndersHejlsberg提出的某个大胆的PR被广泛讨论时,都会感到兴奋。同时,我也依然热衷于帮助其他开发者学习TypeScript,提升他们的使用能力。我希望这些热情能够在本书中传达给你,也希望本书能让你我一起享受在TypeScript里编程的乐趣!
Wallkill,NY
2024年3月
本书的读者对象
Effective系列书籍的目标是成为该领域的“第二标准书籍”。如果你已经有一定的JavaScript和TypeScript实践经验,那么你无疑能从本书中获得最大的收益。本书的目标不是教你TypeScript或JavaScript,而是帮助你从初学者或中级用户成长为专家。书中的各条将帮助你建立对TypeScript及其生态系统的认知模型,让你认识到需要规避的陷阱,并指导你如何以最有效的方式使用TypeScript的众多功能。
一本参考书可能会告诉你某个功能的五种实现方式,而一本Effective系列的书籍会告诉你应该选择哪一种,并解释其中的原因。
近年来,TypeScript发展迅速,但我希望它已经足够稳定,好让本书的内容在未来几年内保持有效。本书主要关注TypeScript语言本身,而不是特定的框架或构建工具。因此,你不会在本书中找到如何在TypeScript中使用React或Vue,或如何配置TypeScript以配合webpack或Vite。本书的技巧适用于所有TypeScript用户。
写作目的
当我刚开始在Google工作时,我收到了一本ScottMeyers的《Effective C++》(Addison-Wesley Professional)。这本书与我读过的其他编程书籍完全不同。它并没有试图迎合初学者,也不是对C++语言的完整指南。它没有单纯介绍C++的各种特性,而是告诉你应该如何(以及不应该如何)使用它们。
……




















