新書推薦:
《
严复与福泽谕吉启蒙思想比较(王中江著作系列)
》
售價:HK$
165.0
《
甘于平凡的勇气
》
售價:HK$
49.5
《
存在与结构:精神分析的法国转向——以拉康与萨特为中心
》
售價:HK$
52.8
《
生成式人工智能:AIGC与多模态技术应用实践指南
》
售價:HK$
108.9
《
石油帝国的兴衰:英国的工业化与去工业化
》
售價:HK$
97.9
《
古典的回響:溪客舊廬藏明清文人繪畫
》
售價:HK$
437.8
《
根源、制度和秩序:从老子到黄老学(王中江著作系列)
》
售價:HK$
121.0
《
索恩丛书·北宋政治与保守主义:司马光的从政与思想(1019~1086)
》
售價:HK$
75.9
|
編輯推薦: |
本书首先介绍了TypeScript 的基本语法和基本的自动化工作流配置方法,然后从面向对象入手,着重介绍了面向对象的概念和它的一些*实践,并结合例子讲解了如何基于TypeScript 的类型系统应用这些*佳实践。随后剖析了TypeScript 在编译后的运行时行为,并从性能与测试的角度讲解了如何编写健壮的TypeScript 代码,所以书中还包括了性能分析与测试相关的内容。*后介绍了如何使用TypeScript 结合面向对象、MVC 等概念,结合本书前面提到的自动化的工作流、面向对象*实践、性能优化和测试等内容实现一个单页应用(SPA)框架,并用这个框架构建了一个单页应用。
|
內容簡介: |
学习基础知识:学习 TypeScript 的不同类型和类型运算符,了解其作用和用法。
探讨高级话题:理解 TypeScript 复杂的类型系统,学习如何安全地处理错误和构建异步程序。
联系实际应用:在你钟爱的前后端框架中使用 TypeScript,把现有的 JavaScript 项目迁移到 TypeScript,以及在生产环境中运行 TypeScript 应用。
|
關於作者: |
Boris Cherny 就职于 Facebook,是工程和产品部门主管。他曾在风投公司、广告技术公司和一些初创公司工作。他喜欢研究编程语言、代码合成和静态分析,乐于构建让人钟爱的用户体验。
|
目錄:
|
目录
前言 1
第1 章 导言 9
第2 章 TypeScript 概述 . 13
2.1 编译器 .13
2.2 类型系统 15
TypeScript VS. JavaScript.16
2.3 代码编辑器设置 20
2.3.1 tsconfig.json .20
2.3.2 tslint.json .22
2.4 index.ts 23
2.5 练习题 .24
第3 章 类型全解 26
3.1 类型术语 27
3.2 类型浅谈 28
3.2.1 any .28
3.2.2 unknown 30
3.2.3 boolean 30
3.2.4 number .32
3.2.5 bigint .33
3.2.6 string 34
3.2.7 symbol .34
3.2.8 对象 .35
3.2.9 中场休息:类型别名、并集和交集.42
3.2.10 数组 .46
3.2.11 元组 .48
3.2.12 null、undefined、void 和never .51
3.2.13 枚举 .53
3.3 小结 .58
3.4 练习题 .58
第4 章 函数 60
4.1 声明和调用函数 60
4.1.1 可选和默认的参数 .62
4.1.2 剩余参数64
4.1.3 call、apply 和bind 65
4.1.4 注解this 的类型 66
4.1.5 生成器函数 68
4.1.6 迭代器 .70
4.1.7 调用签名72
4.1.8 上下文类型推导 75
4.1.9 函数类型重载 76
4.2 多态 .83
4.2.1 什么时候绑定泛型 .88
4.2.2 可以在什么地方声明泛型 .89
4.2.3 泛型推导91
4.2.4 泛型别名93
4.2.5 受限的多态 95
4.2.6 泛型默认类型 100
4.3 类型驱动开发 101
4.4 小结 .102
4.5 练习题 .103
第5 章 类和接口 104
5.1 类和继承 104
5.2 super 110
5.3 以this 为返回类型 . 111
5.4 接口 . 113
5.4.1 声明合并 115
5.4.2 实现 . 117
5.4.3 实现接口还是扩展抽象类 . 119
5.5 类是结构化类型 120
5.6 类既声明值也声明类型 .121
5.7 多态 .124
5.8 混入 .125
5.9 装饰器 .129
5.10 模拟final 类 .132
5.11 设计模式 133
5.11.1 工厂模式 133
5.11.2 建造者模式 134
5.12 小结 .136
5.13 练习题 .136
第6 章 类型进阶 138
6.1 类型之间的关系 139
6.1.1 子类型和超类型 139
6.1.2 型变 .141
6.1.3 可赋值性148
6.1.4 类型拓宽149
6.1.5 细化 .154
6.2 全面性检查 159
6.3 对象类型进阶 161
6.3.1 对象类型的类型运算符 .161
6.3.2 Record 类型 .166
6.3.3 映射类型167
6.3.4 伴生对象模式 170
6.4 函数类型进阶 171
6.4.1 改善元组的类型推导 .171
6.4.2 用户定义的类型防护措施 .172
6.5 条件类型 174
6.5.1 条件分配175
6.5.2 infer 关键字 .177
6.5.3 内置的条件类型 178
6.6 解决办法 179
6.6.1 类型断言179
6.6.2 非空断言180
6.6.3 明确赋值断言 183
6.7 模拟名义类型 184
6.8 安全地扩展原型 187
6.9 小结 .189
6.10 练习题 .190
第7 章 处理错误 192
7.1 返回null 193
7.2 抛出异常 194
7.3 返回异常 197
7.4 Option 类型 199
7.5 小结 .206
7.6 练习题 .207
第8 章 异步编程、并发和并行 . 208
8.1 JavaScript 的事件循环 .209
8.2 处理回调 211
8.3 promise:让一切回到正轨 214
8.4 async 和await 219
8.5 异步流 .220
事件发射器.221
8.6 多线程类型安全 224
8.6.1 在浏览器中:使用Web 职程.224
8.6.2 在NodeJS 中:使用子进程 .234
8.7 小结 .235
8.8 练习题 .236
第9 章 前后端框架 237
9.1 前端框架 237
9.1.1 React 239
9.1.2 Angular 67 246
9.2 类型安全的API .250
9.3 后端框架 252
9.4 小结 .253
第10 章 命名空间和模块 254
10.1 JavaScript 模块简史 .255
10.2 import、export .258
10.2.1 动态导入 259
10.2.2 使用CommonJS 和AMD 模块 262
10.2.3 模块模式与脚本模式 .262
10.3 命名空间 263
10.3.1 冲突 .265
10.3.2 编译输出 266
10.4 声明合并 268
10.5 小结 .269
10.6 练习题 .270
第11 章 与JavaScript 互操作 271
11.1 类型声明 272
11.1.1 外参变量声明 275
11.1.2 外参类型声明 277
11.1.3 外参模块声明 278
11.2 逐步从JavaScript 迁移到TypeScript .280
11.2.1 第一步:添加TSC 280
11.2.2 第二步(上):对JavaScript 代码做类型检查(可选) 281
11.2.3 第二步(下):添加JSDoc 注解(可选) .283
11.2.4 第三步:把文件重命名为.ts .284
11.2.5 第四步:严格要求 .285
11.3 寻找JavaScript 代码的类型信息 .286
11.4 使用第三方JavaScript .289
11.4.1 自带类型声明的JavaScript 289
11.4.2 DefinitelyTyped 中有类型声明的JavaScript 290
11.4.3 DefinitelyTyped 中没有类型声明的JavaScript 290
11.5 小结 .292
第12 章 构建和运行TypeScript . 293
12.1 构建TypeScript 项目 .293
12.1.1 项目结构 293
12.1.2 构建产物 294
12.1.3 设置编译目标 295
12.1.4 生成源码映射 300
12.1.5 项目引用 300
12.1.6 监控错误 303
12.2 在服务器中运行TypeScript .304
12.3 在浏览器中运行TypeScript .304
12.4 把TypeScript 代码发布到NPM 中 307
12.5 三斜线指令 308
12.5.1 types 指令 309
12.5.2 amd-module 指令 .310
12.6 小结 . 311
第13 章 总结 313
附录A 类型运算符 . 315
附录B 实用类型 317
附录C 限定作用范围的声明 . 319
附录D 为第三方JavaScript 模块编写声明文件的
技巧 321
附录E 三斜线指令 . 329
附录F 安全相关的TSC 编译器标志 . 331
附录G TSX . 333
|
內容試閱:
|
前言
本书适合各类程序员阅读,例如JavaScript 专业工程师、C# 从业者、Java 拥护者、Python 爱好者、Ruby 偏爱者和Haskell 支持者。不管你使用什么编程语言,只要有一定的编程经验,了解函数、变量、类和错误等基础知识,就可以阅读这本书。如果你使用过JavaScript,有文档对象模型(DocumentObject Model,DOM)和网络编程经验,那就更好了。本书虽然没有深入探讨这些概念,但是将从这些方面举例。如果你不熟悉这些概念,可能无法深入领会示例的意图。
无论使用哪一门编程语言,我们都有共同的经历。为了追查异常,我们一行一行分析代码,找出问题所在,各个击破。而TypeScript 能助我们一臂之力,它会自动检查代码,指出那些逃过我们眼睛的错误。
如果你没使用过静态类型语言也没关系。笔者将教你类型的知识,告诉你如何使用类型减少程序崩溃的可能、提升代码的语义,便于多位工程师共同维护,也让应用能惠及更多的用户,能在多台服务器上弹性伸缩。在行文上,笔者将力求浅显易懂,以直观、易记的方式讲解相关概念,从实用角度出发,通过大量示例把抽象的问题讲清楚。
与其他类型语言相比,TypeScript 的特点是非常注重实用。TypeScript 发明了一套全新的概念,保证代码简洁、准确,使编写应用的过程充满乐趣,更符合现代标准,也更安全。
内容结构
本书有两个目的:一是深入讲解TypeScript 语言的原理(理论层面);二是给出大量实用的建议,助你写出更好的TypeScript 代码(应用层面)。
前面说过,TypeScript 是一门注重实用的语言,理论与应用往往是联系在一起的。本书多数篇幅将穿插讲解这两方面,不过前几章基本只讲理论,后几章则几乎只说具体应用。
本书首先介绍编译器、类型检查器和类型的基础知识。然后,分别说明TypeScript 中不同类型和类型运算符的作用和用法。掌握这些基础之后,可以深入探讨一些高级话题,比如TypeScript 最为复杂的类型系统特性、错误处理和异步编程。最后,说明怎样结合你最喜欢的框架(前端和后端)使用TypeScript,如何把现有的JavaScript 项目迁移到TypeScript,以及如何在生产环境下运行TypeScript 应用。
本书每章的末尾都有练习题,请你尝试自己解答,这样才能更深入地领会所讲的内容。练习题的参考答案在网上,地址为https:github.combchernyprogramming-typescript-answers。
代码风格
本书尽量一以贯之,使用同一种代码风格。笔者采用的代码风格有一部分带有强烈的个人风格,例如:
只在必要时使用分号。
使用两个空格缩进。
在简单的代码片段中,或者程序的结构比细节重要时,使用简短的名称命名变量,例如a、f 或_。
本书使用的编程风格,有一部分也建议你采用。比如说:
应该使用最新的JavaScript 句法和特性(最新版JavaScript 通常称为esnext)。这样能让代码符合最新的标准,提升代码的互操作性,便于搜索,也能减少新员工的前期投入时间。此外,还可以充分利用JavaScript 的新特性,例如箭头函数、promise 和生成器。
尽量使用展开运算符(...),保持数据结构不可变。注1
所有值都要有类型,不过尽量推导而出。切记不要滥用显式类型,让类型错误暴露出来,从而保证代码简洁、增加安全。
保证代码的可用性和普适性。多态(见4.2 节)是个有力的工具。
当然,这些思想都是全新的。不过,沿用这些风格对TypeScript 的正常运作有至关重要的作用。TypeScript 内置的下层编译器支持只读类型,有强大的类型推导功能,深置对多态的支持,而且具有完整的结构化类型系统,这些都促使我们使用良好的编程风格。与底层的JavaScript 相比,TypeScript 在语言层面上仍不失表现力和真实性。
在进入正文之前,还有几点要说明。
JavaScript 没有指针和引用的概念,有的只是值和引用类型。值是不可变的,包括字符串、数字和布尔值;而引用通常指向可变的数据结构,例如数组、对象和函数。本书中出现的值,一般不使用它的严格定义,而是指JavaScript 值或引用。
注1: 以防你没接触过 JavaScript,举个例子:假如有个对象 o ,我们想为该对象添加一个值为3 的属性 k;为此,可以直接修改 o,使用o.k = 3 句法,也可以使用 let p ={...o, k: 3} 句法,新建一个对象。
最后,在与JavaScript 互操作时,使用未严格遵守类型规定的第三方库时,维护旧代码或匆匆上手时,很容易写出不太理想的TypeScript 代码。本书的主要目的是教你如何正确编写TypeScript,告诫你一定要遵守规则。但在实际中,怎么编写代码才算正确要看你自己或你的团队。
本书约定
本书采用下述排版约定。
斜体(Italic)
表示新术语、URL、电子邮件地址、文件名和扩展名。
等宽字体(Constant Width)
表示程序清单,在段落中出现则表示程序元素,例如变量、函数名、数据类型、环境变量、语句和关键字。
斜体等宽字体(Constant Width Italic)
表示应该替换成用户提供的值,或者由上下文决定的值。
使用代码示例
本书的补充材料(代码示例、练习题等)可到https:github.combchernyprogramming-typescript-answers 下载。
本书是帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无需获得许可。比如,用本书的几个代码片段写一个程序就无需获得许可,销售或分发OReilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。
我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和ISBN。比如:Programming TypeScript by Boris Cherny OReilly. Copyright 2019 Boris Cherny, 978-1-492-03765-1.。
如果你觉得自己对示例代码的用法超出了上述许可的范围, 请通过
permissions@oreilly.com 与我们联系。
OReilly Online Learning
40 年间,OReilly Media 为众多公司提供技术和商业培
训,提升知识储备和洞察力,为企业的成功助力。
我们有一群独家专家和创新者,他们通过图书、文章、会议和在线学习平台分享知识和技术。OReilly 的在线学习平台提供按需访问的直播培训课程、详细的学习路径、交互式编程环境,以及由OReilly 和其他200 多家出版社出版的书籍和视频。详情请访问http:oreilly.com。
联系我们
任何有关本书的意见或疑问,请按照以下地址联系出版社。
美国:
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
勘误、示例和其他信息可到https:oreil.lyprogramming-typescript 上获取。
对本书的评论或技术疑问,可以发电子邮件到bookquestions@oreilly.com。
欲了解本社图书、课程、会议和新闻等更多信息,请访问我们的网站http:www.oreilly.com。
我们的Facebook:http:facebook.comoreilly。
我们的Twitter:http:twitter.comoreillymedia。
我们的YouTube:http:www.youtube.comoreillymedia。
致谢
几年间断断续续的写作和涂涂画画,加上一年的早起晚睡,以及周末和节假日的奋笔疾书,这本书才得以出版。
感谢OReilly 策划这样一本书,感谢编辑Angela Rufino 在整个过程中给予我的支持。感谢Nick Nance 对9.2 节的贡献,感谢Shyam Seshadri 对9.1.2 节的贡献。感谢技术编辑Daniel Rosenwasser,他是TypeScript 团队的一员,用了很多时间阅读草稿,指导我弄清了TypeScript 类型系统的方方面面。感谢Jonathan Creamer、Yakov Fain、Paul Buying 和Rachel Head 对本书做技术编辑、提供反馈。感谢我的家人Liza、Ilya、Vadim、Roza、Alik、Faina 和Yosif,感谢他们鼓励才能使我坚持完成这个项目。
感谢我的伴侣Sara Gilford,在撰写本书的过程中她始终支持我,即使取消了周末计划、写作和编程到深夜,她也没有怨言,而且主动与我讨论类型系统的复杂细节。如果没有你,我不可能写完这本书,你的支持让我铭记终生。
|
|