TypeScript 是什么
本教程共 80 篇 · 第 1 篇 · 更新于 2026-08-10 · 约 11 分钟阅读
本节目标:搞清楚 TypeScript 从哪来、解决了什么问题、跟 JavaScript 是什么关系。学完你能向别人清晰地解释”为什么要在项目里用 TypeScript”。
一个真实的故事
先讲个故事——并不是为了吓唬你。
Boris 是一家电商公司的前端工程师。双十一前几天,他改了一个购物车计算价格的函数,改了参数顺序。测试跑了一遍,线上也上了。零点一到,订单系统崩了。
原因?那个函数有 300 多处调用,其中 3 处参数顺序跟新版本不一致。JavaScript 没报任何错,直到用户在支付页面看到 NaN。
Boris 的后半夜,就是在找那 3 个调用里度过的。
这不是 Boris 的问题——这暴露的是动态类型语言在大型项目里的软肋。函数签名改了,没有任何东西告诉你”这里需要更新”。你只能靠记忆、靠 grep、靠祈祷。
TypeScript 就是来回答这个问题的。
JavaScript 的超集
用一个简单的公式理解 TypeScript:
TypeScript = JavaScript + 类型系统
所谓”超集”,就是所有合法的 JavaScript 代码,同时也是合法的 TypeScript 代码。你可以把一个 .js 文件直接改名为 .ts,它就能编译通过——当然,可能会有一些类型警告,但不会卡死你。
这个设计很精妙。它意味着你不需要一次性把整个项目重写为 TypeScript,可以渐进式迁移:先把一个文件改成 .ts,给它加上类型注解,跑通之后再改下一个。
TypeScript 的目标不是取代 JavaScript,而是给 JavaScript 装上一张安全网。就像自行车装上了辅助轮——你可以随时拆掉它,但在你想安全地骑快的时候,它一直都在。
静态类型的价值
JavaScript 是一门动态类型语言。变量的类型在运行时才确定,这意味着:
// JavaScript:运行时才会暴露问题
function calculateDiscount(price, rate) {
return price * (1 - rate);
}
calculateDiscount(100, "0.2"); // 返回 80,因为你传错了类型
calculateDiscount("100"); // 返回 NaN,因为拿一个字符串去参与运算
一个函数接受什么参数、返回什么值——这些信息对 JavaScript 来说全是”到时候再说”。在几十行的脚本里这不是问题,但在几十万行的项目里,每一次调用都是一次潜在的雷。
TypeScript 的做法是把类型检查提前到编译阶段:
// TypeScript:还没跑代码就告诉你这里有问题
function calculateDiscount(price: number, rate: number): number {
return price * (1 - rate);
}
calculateDiscount(100, "0.2");
// 编译错误:Argument of type 'string' is not assignable to parameter of type 'number'.
你看,同样的错误,JavaScript 要等到用户操作时才暴露(或者更糟:返回一个 NaN 但没报错,数据就这样默默地错了下去);TypeScript 在你写代码的时候就告诉你——“这里有个 string,但我需要 number,你检查一下”。
静态类型的三大好处:
- 编译期纠错:拼写错误、类型不匹配、参数数量不对——这些低级 bug 在代码还没跑的时候就截住了。
- 智能提示:IDE 知道你每个变量的类型,所以能给你精准的自动补全。敲
user.后面列出的每个属性和方法都是真实可用的,不是猜的。 - 安全重构:改一个函数名、改一个参数类型,编译器会自动追踪所有引用位置告诉你哪里需要同步修改。重构不再是”改一处,烧三柱香”。
谁在用 TypeScript
TypeScript 已经在业界铺得非常广了。几个标志性事件:
- Angular 从 2.0 起就用 TypeScript 作为官方语言,所有文档、CLI 都默认输出 TypeScript。
- Vue 3 的核心代码用 TypeScript 重写,组合式 API 对 TypeScript 兼容极好。
- VS Code 本身就用 TypeScript 编写——相当于用自己编译自己。
- Deno 和 Bun 两个现代 JS 运行时都内置 TypeScript 支持,.ts 文件可以直接跑。
- 2022 年 State of JS 调查中,TypeScript 的使用率与满意度持续位居前列。
简单来说:你在 2026 年打开一份正经的 JavaScript 项目,十有八九用的是 TypeScript。
演进简史
TypeScript 的故事要从 2012 年说起。微软内部有一个叫 Anders Hejlsberg 的人——C# 的首席架构师,也是 Turbo Pascal 和 Delphi 的创造者。他在 2010 年左右着手设计一门新语言,目标只有一个:在不破坏 JavaScript 兼容性的前提下,引入静态类型。
2012 年 10 月,TypeScript 0.8 公开发布。当时 Windows 8 即将发布,微软想让 .NET 程序员也能用 HTML + JavaScript 开发应用,TypeScript 就是这座桥。
后来几个关键节点:
| 时间 | 版本 | 关键变化 |
|---|---|---|
| 2014 | 1.0 | 第一个正式稳定版,引入类、接口、模块 |
| 2016 | 2.0 | 引入 strictNullChecks,类型安全大幅升级 |
| 2018 | 3.0 | 项目引用(Project References),支持 monorepo |
| 2020 | 4.0 | 可变元组、标记元组,编辑器体验飞跃 |
| 2023 | 5.0 | 标准化装饰器,const 类型参数 |
| 2025–2026 | 6.0 → 7.0 | 用 Go 重写编译器(代号 Corsa),性能提升约 10 倍 |
7.0 是这个教程的基线版本。它是 TypeScript 历史上最大的工程变更——整个编译器从 JavaScript 移植到了 Go 语言,但语言语法和类型系统完全不变。对写代码的你来说,唯一的感受就是:快了,快了很多。
TypeScript 不适合什么
说了这么多好处,也得诚实地说说它不擅长的场景:
- 一次性小脚本:写个几行代码处理文件,加类型注解反而拖慢节奏。
- 快速原型:你在两天内反复推翻好几版,类型系统的维护成本可能会超过收益。
- 团队还没准备好:如果团队里没人熟悉 TypeScript,强行推会有一段磨合期。
TS 的核心价值在于”可维护性”,如果这个项目压根不需要长期维护,用纯 JavaScript 完全没问题。
接下来
好的,故事讲完了。你对 TypeScript 有了一个全局的认识——它从哪来、解决什么、跟 JS 什么关系。
下一章,我们动手把它装上。