Skip to content

开篇词你为什么要选择TypeScript?

你好,我是乾元,在 10 年的前端开发工作中,我曾就职于去哪儿、搜狗等大厂。作为核心成员,我曾负责过多个前端框架、组件库、开源项目核心模块的开发和维护,还为知名 MVVM 框架 Avalon 核心模块贡献过十多个 Commit。

2018 年起,我正式推动 TypeScript 在部门级业务方向的全面应用。至今,我构建了 TypeScript + React、Redux、Nest.js 的全栈技术生态,并积累了丰富的 TypeScript 设计开发经验。同时,我还从 0-1 打造了一支全栈技术架构团队,目前该团队已平稳支撑了公司数百个业务项目。

我是在什么样的机缘巧合下与 TypeScript 相逢的呢?这不得不提起当时的一场面试经历。

一次激发我好奇心的面试经历

2018 年的一场社招面试中,我见到了一个来自微软的 C# 技术栈转前端的候选人。

当时,前端的面试套路中必然包含 JavaScript 隐式类型转换的知识点,如下代码所示:

java
[] == ''

而这个候选人的回答让我很是诧异,一个从国际大厂出来的面试者,似乎并没有掌握 JavaScript 隐式类型转换的规则。

注意:隐式类型转换的规则是当 == 操作符两侧的值不满足恒等时(===),则先将空数组转换为字符串类型,然后再进行恒等比较。

我好奇地问他:"难道平时你都不关注这些基础知识?"

他回答:"虽然平时使用 TypeScript,但是并不需要关注这些规则。"

虽然这场面试并不算成功,但激发了我的好奇心:TypeScript 真的能将我们从隐式类型转换等 JavaScript 的各种坑中拯救出来

于是,我开始在业务应用中尝试引入 TypeScript。通过使用静态类型约束 React 组件 Props 和 State,我发现它与使用 JavaScript 相比,不仅支持在任何地方直观地获取组件的接口定义,还能对属性、状态中的值是否为空进行自动检测并给出提示(容错处理),甚至还支持对 React JSX 元素接收的各种属性、方法的检测和提示。

这样看来 TypeScript 实在是太香了,这让我萌生了在接口调用、Redux 代码中全面引入 TypeScript 的想法

2018 年中,我开始做 To B 应用。考虑到 To B 应用的业务逻辑及其复杂性,它对代码的稳定性、易读性、可维护性要求极高,而这正高度契合 TypeScript 的优势。于是,我正式开始推广全栈式 TypeScript 技术方案

在接下来的两年多时间里,这套技术方案支撑了数百个应用的 Web 端、Node.js 端开发,接受了近百万行业务代码的实践考验。相对于 JavaScript 应用而言,TypeScript 使得许多低级的 Bug 在开发阶段就能被检测出来并得到快速解决,显著提升了项目的整体质量和稳定性。

在见证业务发展的同时,我还见证了 TypeScript 版本从 3.0 迭代到 4.1,最终成了极其成熟且强大的语言和工具。其中,它有诸多重量级特性发布:

  • unknown(3.0)

  • stricter generators(3.6)

  • optional chain(3.7)

  • type-only import & export(3.8)

  • template literal(4.1)

现如今,当我再次回味起那位候选人的回答,才明白 TypeScript 可能压根就不允许这么使用。因为当你写下 [] == ' ',立刻会收到一个红色波浪标注的 ts(2367) 错误提示。

TypeScript 有这么好用吗?

1. TypeScript 的本质

TypeScript 与 JavaScript 本质并无区别,你可以将 TypeScipt 理解为是一个添加了类型注解的 JavaScript,比如 const num = 1,它同时符合 TypeScript 和 JavaScript 的语法。

此外,TypeScript 是一门中间语言,最终它还需要转译为纯 JavaScript,再交给各种终端解释、执行。不过,TypeScript 并不会破坏 JavaScript 既有的知识体系,因为它并未创造迥异于 JavaScript 的新语法,依旧是"熟悉的配方""熟悉的味道"。

2. TypeScript 更加可靠

在业务应用中引入 TypeScript 后,当我们收到 Sentry(一款开源的前端错误监控系统)告警,关于"'undefined' is not a function""Cannot read property 'xx' of null|undefined" 之类的低级错误统计信息基本没有。而这正得益于 TypeScript 的静态类型检测,让至少 10% 的 JavaScript 错误(主要是一些低级错误)能在开发阶段就被发现并解决。

我们也可以这么理解,在所有操作符之前,TypeScript 都能检测到接收的类型(在代码运行时,操作符接收的是实际数据;静态检测时,操作符接收的则是类型)是否被当前操作符所支持。

当 TypeScript 类型检测能力覆盖到整个文件、整个项目代码后,任意破坏约定的改动都能被自动检测出来(即便跨越多个文件、很多次传递),并提出类型错误。因此,你可以放心地修改、重构业务逻辑,而不用过分担忧因为考虑不周而犯下低级错误

接手复杂的大型应用时,TypeScript 能让应用易于维护、迭代,且稳定可靠,也会让你更有安全感。

3. 面向接口编程

编写 TypeScript 类型注解,本质就是接口设计。

以下是使用 TypeScript 设计的一个展示用户信息 React 组件示例,从中我们一眼就能了解组件接收数据的结构和类型,并清楚地知道如何在组件内部编写安全稳定的 JSX 代码。

typescript
interface IUserInfo {
  /** 用户 id */
  id: number;
  /** 用户名 */
  name: string;
  /** 头像 */
  avatar?: string;
}
function UserInfo(props: IUserInfo) {
  ...
}

TypeScript 极大可能改变你的思维方式,从而逐渐养成一个好习惯。比如,编写具体的逻辑之前,我们需要设计好数据结构、编写类型注解,并按照这接口约定实现业务逻辑。这显然可以减少不必要的代码重构,从而大大提升编码效率。

同时,你会更明白接口约定的重要性,也会约束自己/他人设计接口、编写注解、遵守约定,乐此不疲。

4. TypeScript 正成为主流

相比竞争对手 Facebook 的 Flow 而言,TypeScript 更具备类型编程的优势,而且还有 Microsoft、Google 这两家国际大厂做背书。

另外,越来越多的主流框架 (例如 React、Vue 3、Angular、Deno、Nest.js 等)要么选用 TypeScript 编写源码,要么为 TypeScript 提供了完美的支持

随着 TypeScript 的普及,TypeScript 在国内(国内滞后国外)成了一个主流的技术方向,国内各大互联网公司和中小型团队都开始尝试使用 TypeScript 开发项目,且越来越多的人正在学习和使用它。

而能够熟练掌握 TypeScript 的开发人员,将能轻松拿下大厂 Offer。下面我截取了拉勾招聘官网的一些大厂招聘要求,你可以参考。

好工具,需要好的学习方式

TypeScript 在国内成为主流技术方向的时间较晚,大概在 2018 年左右才开始流行。相应地,本土化学习资料也比较匮乏。

2018 年 9 月,在我推广 TypeScript 之际,就连 Babel、create-react-app 官方对 TypeScript 的支持都还不太友好,我主要通过 Medium 等国外资源查阅大量关于 Best Practice of TypeScript、React + TypeScript、Redux + TypeScript 的文章,最终设计并架构了面向部门业务的 TypeScript 技术栈。

伴随着业务的成长,不断有新同学加入,而很多新同学其实并没有任何 TypeScript 开发的经验。那么,如何让更多同学更快速、有效地掌握技术栈,就成了我想解决的关键问题。因此,我又制作了系列培训内容帮助新人快速成长。本课程正是基于此前的实战经验精炼而成,旨在帮助你快速掌握 TypeScript 技术栈,学会构建高可读性、高稳定性前端应用。

结合上百个业务应用开发经验 总结,我将课程划分为入门、进阶、实战 3 个模块,讲解的都是真实业务场景最实用的知识点,绝非纸上谈兵。按照知识点的顺序和难易程度,共计 22 讲。

  • 模块 1:TypeScript 入门

我将介绍 TypeScript 环境搭建,并结合浅显易懂的示例与应用场景讲解 TypeScript 基础类型,也会分享我作为过来人学习 TypeScript 时总结的经验和教训,让你尽量少走弯路,直达重点。这部分内容是掌握 TypeScript 编程的一块敲门砖,学完之后,你将对 TypeScript 的核心知识和概念有个整体印象。

  • 模块 2:TypeScript 进阶

主要讲解类型守卫、类型兼容、工具类型等概念,及其在实际业务中的作用和使用技巧,助你快速成长为玩转 TypeScript 高阶开发的"魔法师"。学完之后,能加深你对进阶知识和工具的理解,并教你掌握造轮子(打造自己的工具类型)进行类型编程的能力。

  • 模块 3:实战指南

我将结合业务实战经验系统化地讲解 TypeScript Config 配置、TypeScript 常见错误分析定位、浏览器和 Node.js 端开发等知识,以及 JavaScript 项目改造实践。让我们既可以按需定制 TypeScript 类型系统行为和转译产物,还能在碰到官方文档较少提及的各种错误时,快速地对问题进行定位和修复。另外,无论是从零开始的新项目,还是历史遗留的技术债,我们都能有章可循地引入 TypeScript。

并且,此模块我会穿插分享历经数百个应用开发总结出来的 TypeScript 开发最佳实践经验,助你在业务开发中得心应手地应用 TypeScript,并获得 TypeScript 在 Web 和 Node.js 端最佳开发实践的建议。

TypeScript 发版频繁,特性日新月异,从构思课程到截稿,TypeScript 已经发布了 4.1、4.2 版本(当你读到这段文字,也有可能又发布了 4.3、4.4......),不过核心知识和思想并未过时。当然,在最后的结束语中,我也会介绍一些新版本比较重要的特性。

讲师寄语

看明白知识点很容易,而难点在于融会贯通。除了关注工程实践,我们更应该关注核心知识点的深入理解和吸收,避免从理论到实践无从着手的无力感,因为只有吃透其中的原理(生硬的知识点),才能真正打造属于自己的强有力武器

本专栏经过精心打磨,并巧妙打磨大量示例,带你轻松学习、有效吸收。你还在犹豫吗?赶紧搭上 TypeScript 学习班车,大厂 Offer 就在前方!