01 - TypeScript 简介
TypeScript 简介
什么是 TypeScript?
TypeScript 是由 Microsoft 开发和维护的开源编程语言。它是 JavaScript 的超集(superset),在 JavaScript 的基础上添加了静态类型系统(static type system)和其他语言特性。
// 这是一段合法的 TypeScript 代码——同时也是合法的 JavaScript 代码
const greeting: string = "Hello, TypeScript!";
console.log(greeting);
核心理念可以概括为一句话:
TypeScript = JavaScript + 静态类型
发展历史
| 时间 | 事件 |
|---|---|
| 2010 年 | Anders Hejlsberg(C# 之父)在 Microsoft 内部启动 TypeScript 项目 |
| 2012 年 10 月 | TypeScript 0.8 正式公开发布 |
| 2014 年 4 月 | TypeScript 1.0 发布,标志着语言稳定 |
| 2016 年 9 月 | TypeScript 2.0 引入 null 和 undefined 类型控制 |
| 2018 年 8 月 | TypeScript 3.0 引入可变参数元组类型 |
| 2020 年 8 月 | TypeScript 4.0 引入可变元组、标签模板字面量 |
| 2023 年 3 月 | TypeScript 5.0 引入装饰器(Decorators)标准支持 |
| 2025 年 | TypeScript 5.x 持续改进类型推断和性能 |
| 2026 年 | TypeScript 6.0 发布,编译性能大幅提升 |
创始人:Anders Hejlsberg
Anders Hejlsberg 是编程语言领域的传奇人物,他的代表作品包括:
- Turbo Pascal(1983)——经典的 Pascal 编译器
- Delphi(1995)——快速应用开发工具
- C#(2000)——.NET 平台核心语言
- TypeScript(2012)——JavaScript 的类型化超集
设计目标
TypeScript 的设计遵循以下核心目标:
1. 静态类型检查
// TypeScript 会在编译时发现类型错误
function add(a: number, b: number): number {
return a + b;
}
add("1", 2); // ❌ 编译错误:类型 "string" 不能赋给类型 "number"
2. 与 JavaScript 完全兼容
任何合法的 JavaScript 代码都是合法的 TypeScript 代码。这意味着:
- 无需重写现有代码即可开始使用 TypeScript
- 可以逐步在项目中引入类型
- 所有 JavaScript 库都可以直接使用
// 这段纯 JavaScript 可以直接保存为 .ts 文件
const items = [1, 2, 3];
const doubled = items.map(item => item * 2);
console.log(doubled); // [2, 4, 6]
3. 遵循 ECMAScript 标准
TypeScript 跟踪 ECMAScript(JavaScript 的标准化名称)的最新特性,并在编译时将其转换为目标环境支持的版本。
// 使用 ES2022 的顶层 await(TypeScript 支持)
const response = await fetch("https://api.example.com/data");
const data = await response.json();
// 使用 ESNext 的装饰器
function log(target: any, key: string) {
console.log(`访问了属性: ${key}`);
}
class User {
@log
name = "Alice";
}
TypeScript vs JavaScript
| 特性 | JavaScript | TypeScript |
|---|---|---|
| 类型系统 | 动态类型(dynamic) | 静态类型(static) |
| 编译步骤 | 无需编译 | 需要编译为 JS |
| 类型注解 | 不支持 | 支持 |
| 接口(interface) | 不支持 | 支持 |
| 枚举(enum) | 不支持 | 支持 |
| 泛型(generics) | 不支持 | 支持 |
| 装饰器(decorator) | 提案阶段 | 原生支持 |
| 学习曲线 | 较低 | 稍高 |
| 开发工具支持 | 基础 | 优秀(智能提示、重构) |
| 运行时 | Node.js / 浏览器 | 编译为 JS 后运行 |
| 社区生态 | 极其庞大 | 快速增长,已成主流 |
编译过程
TypeScript 代码不能直接在浏览器或 Node.js 中运行,需要先编译(compile)为 JavaScript:
源代码 (.ts/.tsx)
│
▼
TypeScript 编译器 (tsc)
│
▼
JavaScript 代码 (.js/.jsx)
│
▼
浏览器 / Node.js 运行
// 源文件:app.ts
interface User {
name: string;
age: number;
}
function greet(user: User): string {
return `你好,${user.name}!你今年 ${user.age} 岁。`;
}
const alice: User = { name: "Alice", age: 25 };
console.log(greet(alice));
// 编译输出:app.js(剥离了所有类型信息)
function greet(user) {
return `你好,${user.name}!你今年 ${user.age} 岁。`;
}
const alice = { name: "Alice", age: 25 };
console.log(greet(alice));
注意:TypeScript 的类型信息只存在于编译阶段,运行时(runtime)不会有任何类型信息。这意味着 TypeScript 不会改变 JavaScript 的运行时行为。
为什么选择 TypeScript?
业务场景:大型团队协作
假设一个 10 人团队维护一个电商平台前端项目:
不使用 TypeScript:
// 开发者 A 写的函数
function createOrder(product, quantity, user) {
// product 是什么结构?quantity 是字符串还是数字?user 有哪些字段?
// 只有读源码才能知道
}
// 开发者 B 调用时
createOrder("iPhone", "2", { name: "Alice" });
// quantity 传了字符串,运行很久后才发现 Bug
使用 TypeScript:
interface Product {
id: string;
name: string;
price: number;
}
interface User {
id: string;
name: string;
email: string;
}
function createOrder(product: Product, quantity: number, user: User): Order {
// 参数类型清晰明确,IDE 提供完整提示
}
// 开发者 B 调用时
createOrder("iPhone", 2, { name: "Alice" });
// ❌ 编译错误:Product 缺少 id 和 price 字段
// ❌ 编译错误:User 缺少 id 和 email 字段
真实数据
根据多个行业调查和统计:
| 指标 | 数据 |
|---|---|
| npm 上含 TypeScript 类型定义的包 | 超过 80% 的流行包 |
| GitHub 上 TypeScript 仓库增长 | 年均增长 30%+ |
| 企业级项目采用率 | 前 100 的 npm 包中约 65% 使用 TypeScript |
| Bug 减少率 | 引入 TypeScript 后平均减少 15% 的 Bug(Microsoft 研究) |
谁在用 TypeScript?
许多知名项目和公司都在使用 TypeScript:
- 前端框架:Angular(原生 TypeScript)、Vue 3(重写为 TypeScript)、React(官方支持)
- 开发工具:VS Code(TypeScript 开发)、Deno(原生 TypeScript 运行时)、Bun
- 后端框架:NestJS、tRPC、Fastify
- 企业用户:Microsoft、Google、Airbnb、Slack、Discord、Asana
TypeScript 的编译器
TypeScript 的编译器 tsc 本身是用 TypeScript 编写的(自举/bootstrapping)。这是一个有趣的工程实践——用自己来编译自己。
TypeScript 源码 (.ts)
│
▼
之前版本的 tsc
│
▼
当前版本的 tsc (.js)
TypeScript 的版本策略
TypeScript 采用语义化版本(Semantic Versioning):
- 主版本(Major):不兼容的重大变更
- 次版本(Minor):新增特性,每几周发布一次
- 修订版本(Patch):Bug 修复
# 查看当前版本
tsc --version
# 安装特定版本
npm install [email protected]
注意:TypeScript 的
minor版本可能包含一些细微的类型检查变更,升级时建议查看 TypeScript 发布日志。
学习路线图
基础入门 核心特性 高级类型
│ │ │
├─ 基本类型 ├─ 接口 ├─ 工具类型
├─ 函数 ├─ 类 ├─ 条件类型
├─ 类型推断 ├─ 泛型 ├─ 映射类型
│ ├─ 联合/交叉 ├─ 模板字面量
│ └─ 类型收窄 │
│ │
▼ ▼
框架实战 工程化实践 高级主题
│ │ │
├─ React + TS ├─ 构建配置 ├─ 类型体操
├─ Node.js + TS ├─ 测试 ├─ 声明文件
├─ DOM 操作 ├─ 迁移指南 ├─ 编译器 API
└─ HTTP 请求 └─ 最佳实践 └─ 装饰器