TypeScript logo

TypeScript

JavaScript 的超集,通过静态类型系统提升大型项目的可维护性和开发体验,同时提供完整的编译转译能力。

精选工具编译转译类型系统JavaScript 超集静态类型

TypeScript 由 Microsoft 开发,是 JavaScript 最成功的超集语言,增加了静态类型系统和编译转译能力。2025-2026 年 Go 重写版本(TypeScript 7)将编译性能提升约 10 倍,已成为 GitHub #1 编程语言。

TypeScript — 类型系统与 TS 编译器

JavaScript 的超集,通过静态类型系统提升大型项目的可维护性和开发体验,同时提供完整的编译转译能力。

技术简介说明

TypeScript 由 Microsoft 开发,是 JavaScript 最成功的超集语言。它在 JavaScript 基础上增加了静态类型系统、接口、泛型、枚举等语言特性,使开发者能够在编译期发现潜在错误,获得更好的 IDE 智能提示和代码导航体验。TypeScript 的类型系统是结构化类型系统(Structural Type System),也称为"鸭子类型"——类型兼容性由结构决定而非名义继承关系。

TypeScript 编译器的角色具有双重性:一方面它是一个完整的类型检查器,在编译期验证类型正确性;另一方面它也是一个转译器,将 TypeScript 代码编译为纯 JavaScript 输出。这种双重角色使 TypeScript 在编译转译工具中占据独特地位——它不仅能做语法降级,还能提供其他工具无法替代的类型安全保障。

2025-2026 年是 TypeScript 的关键转折期。TypeScript 5.x 系列引入了 --erasableSyntaxOnlyimport defer 等重要特性;TypeScript 6.0 默认启用严格模式;而最大的变革是 Go 语言重写(Project Corsa / TypeScript 7),将编译性能提升约 10 倍。GitHub 上 TypeScript 已超越 Python 成为 2025 年底的 #1 编程语言,npm 周下载量超过 2.1 亿。

基本信息

项目详情
官网https://www.typescriptlang.org
GitHubhttps://github.com/microsoft/TypeScript
Go 重写仓库https://github.com/microsoft/typescript-go
LicenseApache-2.0
最新稳定版(JS)v6.0.3(2026 年 3 月 23 日,过渡版本)
下一重大版本TypeScript 7.0(Go 原生编译器,预计 2026 年中/晚正式发布)
主要维护者Anders Hejlsberg(首席架构师)、Ryan Cavanaugh(Dev Lead)、Daniel Rosenwasser(PM)
公司Microsoft
GitHub Stars~109,478(Go 重写仓库 ~25,800)
npm 周下载量~2.115 亿

快速上手

安装

# 全局安装 TypeScript 编译器
npm install -g typescript
 
# 或在项目中安装为开发依赖
npm install --save-dev typescript
 
# 验证安装
tsc --version

基础配置

运行初始化命令生成 tsconfig.json

tsc --init

推荐的 tsconfig.json 配置(TypeScript 6.0+ 默认):

{
  "compilerOptions": {
    "target": "ES2025",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

最小示例

// src/index.ts
interface User {
  id: number;
  name: string;
  email: string;
}
 
function greetUser(user: User): string {
  return `Hello, ${user.name}! Your email is ${user.email}.`;
}
 
const user: User = {
  id: 1,
  name: "Alice",
  email: "[email protected]"
};
 
console.log(greetUser(user));
# 编译
tsc
 
# 运行输出
node dist/index.js
 
# 或直接运行(不生成文件,仅类型检查)
tsc --noEmit

核心概念与架构

编译器五阶段管道

TypeScript 编译器采用经典的多阶段管道架构:

源代码 ──→ [Scanner] ──→ [Parser] ──→ [Binder] ──→ [Checker] ──→ [Emitter]
            │              │             │             │              │
         Token 流       AST 树        符号表       类型检查      JS 输出
        (scanner.ts)  (parser.ts)   (binder.ts)  (checker.ts)  (emitter.ts)
阶段文件职责
Scanner(扫描器)scanner.ts词法分析,将源代码字符流分解为 Token
Parser(解析器)parser.ts将 Token 流构建为抽象语法树(AST)
Binder(绑定器)binder.ts创建符号表,关联声明与作用域(符号解析)
Checker(检查器)checker.ts类型检查和语义分析——编译器中最复杂的组件(超过 4 万行)
Emitter(发射器)emitter.ts将 AST 转换为 JavaScript 输出和 .d.ts 声明文件

类型系统核心概念

概念说明
结构化类型类型兼容性由结构决定("如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子")
泛型(Generics)参数化类型,支持类型约束、条件类型、映射类型
联合类型与交叉类型A | B(联合)和 A & B(交叉)
类型守卫typeofinstanceof、自定义类型谓词
声明合并接口、命名空间等支持多次声明自动合并
模板字面量类型TypeScript 4.1+,支持字符串级别的类型运算
const 类型参数TypeScript 5.0+,as const 泛型参数

声明文件(.d.ts)

TypeScript 通过声明文件为 JavaScript 库提供类型信息:

// 内置声明文件
/// <reference lib="es2025" />
 
// 社区声明文件(DefinitelyTyped)
npm install --save-dev @types/node @types/react

核心特性

  • 完整的静态类型系统:接口、泛型、联合/交叉类型、条件类型、映射类型、模板字面量类型
  • 渐进式类型化:可以从 any 开始逐步添加类型,也支持 --strict 全严格模式
  • 类型推断:强大的上下文类型推断,减少显式类型注解的需要
  • IDE 集成:与 VS Code、WebStorm 等深度集成,提供智能补全、重构、跳转定义
  • 声明文件生态:DefinitelyTyped 提供超过 1 万个社区维护的 @types
  • --erasableSyntaxOnly:TypeScript 5.8+ 禁止运行时专有语法,确保代码可被类型剥离直接执行
  • import defer:TypeScript 5.9+ 支持延迟模块求值,减少应用启动时间
  • Project References:支持大型项目的增量编译和跨项目引用
  • Go 重写版本(tsgo):TypeScript 7 将使用 Go 原生编译器,编译速度提升约 10 倍
  • 默认严格模式:TypeScript 6.0 起默认启用 strict

生态图

TypeScript 生态系统全景

┌────────────────────────────────────────────────────────────────┐
│                    TypeScript 生态系统                           │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│  编译器                                                        │
│  ├── typescript (tsc)       — 官方编译器(JavaScript 实现)      │
│  ├── @typescript/native-preview — Go 重写预览版(tsgo)         │
│  └── typescript-go          — Go 重写仓库(最终合并回主仓库)    │
│                                                                │
│  类型定义生态                                                   │
│  ├── DefinitelyTyped      — 社区维护的类型定义(@types/*)       │
│  ├── type-fest            — 实用类型集合                         │
│  └── tsd                  — 类型定义测试工具                     │
│                                                                │
│  运行时验证与类型安全                                            │
│  ├── Zod                  — 运行时 Schema 验证 + 类型推断       │
│  ├── tRPC                 — 端到端类型安全 API 框架              │
│  ├── io-ts                — 运行时类型验证                      │
│  └── Effect               — 类型安全的副作用管理                 │
│                                                                │
│  AST 操作与工具                                                  │
│  ├── ts-morph             — TypeScript AST 操作库               │
│  ├── typescript-eslint    — TypeScript 感知的 ESLint 插件       │
│  └── tsutils              — TypeScript 工具函数                  │
│                                                                │
│  构建集成                                                       │
│  ├── ts-loader            — Webpack TypeScript 加载器           │
│  ├── @rollup/plugin-typescript — Rollup TypeScript 插件        │
│  ├── tsx / ts-node        — Node.js 直接运行 TypeScript        │
│  └── vite                 — Vite 通过 esbuild/SWC 转译 TS      │
│                                                                │
│  框架集成(一等 TypeScript 支持)                                │
│  ├── Angular              — 原生 TypeScript 框架                │
│  ├── React                — 深度 TypeScript 支持                │
│  ├── Vue 3                — 原生 TS + Composition API           │
│  ├── Svelte / SvelteKit   — 原生 TypeScript 支持                │
│  ├── Next.js              — 默认 TypeScript 支持                │
│  ├── NestJS               — 后端 TypeScript 框架                │
│  └── Express + types      — 后端 TypeScript 开发                │
│                                                                │
│  开发工具                                                       │
│  ├── TypeScript Playground — 在线编辑器和分享                    │
│  ├── VS Code              — 内置 TypeScript 语言服务            │
│  └── madge                — 依赖图和循环检测                     │
│                                                                │
└────────────────────────────────────────────────────────────────┘

关键依赖

  • TypeScript 编译器是**自举(self-hosted)**的——TypeScript 用 TypeScript 编写
  • typescript-eslint 依赖 TypeScript 编译器 API 进行类型感知 linting
  • 几乎所有现代前端框架都将 TypeScript 作为一等公民支持

适用场景

  • 大型前端应用:类型系统在多人协作和大型代码库中价值最大
  • 后端 Node.js 开发:NestJS、Express + TypeScript 提供完整类型安全的后端开发
  • API 类型安全:结合 Zod + tRPC 实现端到端类型安全的 API 层
  • 库/框架开发:发布带 .d.ts 声明文件的 npm 包,为使用者提供类型提示
  • 代码重构:类型系统提供安全的重构保障,IDE 支持跨文件重命名
  • 文档即代码:类型签名本身就是最好的 API 文档
  • 运行时验证桥接:Zod 等工具将运行时数据验证与静态类型关联

开发与工程化

tsconfig.json 最佳实践

{
  "compilerOptions": {
    // 严格性 —— 新项目务必全开
    "strict": true,
    "noUncheckedIndexedAccess": true,  // 索引访问返回 T | undefined
    "exactOptionalPropertyTypes": true, // 可选属性不允许 undefined
 
    // 模块系统
    "module": "ESNext",
    "moduleResolution": "bundler",     // Vite/Webpack 5 推荐
    "allowImportingTsExtensions": true, // 允许 .ts 扩展名导入
    "noEmit": true,                     // 让打包工具处理输出
 
    // 互操作性
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
 
    // 输出(当 tsc 负责输出时)
    "outDir": "./dist",
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
 
    // 性能
    "incremental": true,               // 增量编译
    "tsBuildInfoFile": "./.tsbuildinfo",
    "skipLibCheck": true               // 跳过声明文件检查
  }
}

Monorepo 项目引用

// packages/tsconfig.base.json
{
  "compilerOptions": {
    "composite": true,
    "declaration": true,
    "declarationMap": true
  }
}
 
// packages/ui/tsconfig.json
{
  "extends": "../tsconfig.base.json",
  "compilerOptions": {
    "outDir": "./dist"
  },
  "references": [
    { "path": "../shared" }
  ]
}

CI/CD 集成

# 类型检查(推荐在 CI 中独立运行)
- name: Type Check
  run: npx tsc --noEmit
 
# 使用 Go 版本加速
- name: Type Check (tsgo)
  run: npx tsgo --noEmit
 
# 增量编译缓存
- name: Cache TS Build Info
  uses: actions/cache@v4
  with:
    path: .tsbuildinfo
    key: ${{ runner.os }}-tsbuildinfo-${{ hashFiles('tsconfig.json') }}

性能与安全

性能特点

方面说明
JS 版本速度对于大型项目(如 VS Code),编译时间约 78 秒
Go 版本速度tsgo 将同样项目编译到 ~7.5 秒,约 10 倍提升
增量编译--incremental + composite 项目引用支持增量类型检查
并行处理Go 版本通过 Goroutine 实现高度并行
类型检查 vs 转译纯转译(剥离类型)远快于完整类型检查

性能优化建议

  1. 使用 skipLibCheck: true:跳过 node_modules 中声明文件的检查
  2. 启用增量编译"incremental": true 保存编译信息以加速后续构建
  3. 项目引用拆分:大型项目使用 composite + references 拆分编译单元
  4. 缩小检查范围:CI 中使用 tsc --noEmit 仅检查类型,不生成输出
  5. 考虑 tsgo 预览:对大型项目,Go 版本的 10 倍加速非常有价值

安全注意事项

  • 类型不等于安全:TypeScript 类型在运行时被完全剥离,as 类型断言可能被滥用
  • 第三方类型质量@types/* 包的质量参差不齐,需要验证
  • any 的危害:过度使用 any 会绕过类型检查,削弱类型安全
  • 运行时验证必要:API 响应、用户输入等运行时数据需要 Zod 等工具做运行时验证

技术对比

与编译转译工具的对比

维度TypeScript (tsc)BabelSWCesbuild
类型检查✅ 完整❌ 仅剥离❌ 仅剥离❌ 仅剥离
编译速度慢(JS 版本)/ 快(Go 版本 ~10x)最快
ECMAScript 特性完整支持最完善(含 Stage 提案)大部分支持有限
JSX
插件系统❌(编译器 API 可扩展)✅ 最丰富✅ Wasm 插件⚠️ 有限
定位类型检查 + 转译纯转译纯转译转译 + 打包

TypeScript 类型剥离 vs 完整类型检查

方式工具速度类型安全
类型剥离(Type Stripping)Node.js 22+、tsgo --strip最快❌ 仅移除类型
完整类型检查tsc、tsgo较慢✅ 完整检查
SWC/esbuild 转译SWC、esbuild最快❌ 仅移除类型
Babel 转译Babel preset-typescript❌ 仅移除类型

何时使用完整类型检查

  • 生产构建前——确保类型安全
  • 大型多人协作项目——防止类型错误传播
  • 库开发——保证公共 API 的类型正确性

何时使用类型剥离

  • 开发阶段——快速迭代
  • 已有独立类型检查步骤——CI 中单独运行 tsc --noEmit
  • 使用 Node.js 22+ 原生运行 TypeScript

最佳实践

类型系统最佳实践

// ✅ 使用具体类型,避免 any
interface ApiResponse<T> {
  data: T;
  error: string | null;
  status: number;
}
 
// ✅ 使用类型守卫
function isUser(value: unknown): value is User {
  return typeof value === 'object' && value !== null && 'id' in value;
}
 
// ✅ 使用 const 断言保持字面量类型
const ROUTES = {
  home: '/',
  about: '/about',
} as const;
 
// ✅ 使用条件类型做类型映射
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
 
// ❌ 避免过度使用 any
// ❌ 避免不必要的类型断言
// ❌ 避免在公共 API 中使用 namespace

常见陷阱

  1. 类型擦除误解:TypeScript 类型在运行时不存在——enumnamespace、参数属性在运行时会被编译为 JavaScript 代码,这与"纯类型"不同
  2. --erasableSyntaxOnly 影响:TypeScript 5.8+ 该选项禁止 enum/namespace/参数属性,确保代码可被类型剥离工具直接处理
  3. 声明文件缺失:某些 npm 包没有 @types 包,需要自己编写声明或使用 declare module
  4. isolatedModules 要求:使用 SWC/esbuild 转译时,需要开启此选项以确保每个文件可独立编译
  5. 循环依赖:TypeScript 不阻止循环导入,但运行时可能导致 undefined 问题

TypeScript 5.8 → 6.0 → 7.0 迁移要点

  1. 5.8:考虑启用 --erasableSyntaxOnly,逐步移除 enum/namespace
  2. 6.0:注意默认 strict: truemodule: "esnext" 可能暴露新的类型错误
  3. 7.0:Go 版本将替代 JS 版本成为默认编译器,关注公共 API 兼容性

技术局限与边界

已知限制

  • 编译速度:JS 版本对于大型项目仍然较慢(Go 版本大幅改善但尚未稳定)
  • 不做打包:tsc 仅负责编译,模块解析和打包需要配合其他工具
  • 类型系统复杂度:高级类型体操(条件类型、映射类型递归)难以调试
  • 声明文件维护成本:为无类型的 JavaScript 库编写 .d.ts 文件成本较高
  • 运行时/编译时分离:类型系统仅在编译时存在,运行时行为可能与类型不一致

不适用场景

  • 快速原型:类型系统会增加初始开发成本(但可通过 any 和渐进式类型化缓解)
  • 小型脚本:对于几十行的小脚本,类型系统是额外负担
  • 纯转译场景:如果只需要剥离类型而不需要类型检查,SWC 或 esbuild 更快
  • 极端性能要求:即使 Go 版本,tsc 的速度仍不及 esbuild 的纯转译

Go 重写版本(TypeScript 7)状态

能力状态
解析(Parsing)✅ 完成
类型检查(Type Checking)✅ 完成
声明文件生成✅ 完成
JS 输出✅ 完成
语言服务🔄 进行中
Watch 模式🔄 原型阶段
公共 API❌ 未就绪

学习资源

2026 年现状

最新版本

  • TypeScript 6.0.3(2026 年 3 月)—— 过渡版本,默认严格模式、ES2025 目标
  • TypeScript 7.0 Beta(2026 年 4 月)—— Go 原生编译器预览版
  • TypeScript 7.0—— 预计 2026 年中/晚正式发布

发展趋势

  1. Go 重写是最大变革:TypeScript 7 将使用 Go 原生编译器,编译速度提升约 10 倍,这将深刻影响 TypeScript 的开发体验
  2. 类型剥离成为主流:Node.js 22+ 原生支持 TypeScript(类型剥离模式),开发阶段不再需要编译器
  3. --erasableSyntaxOnly 推动语法净化:enum 和 namespace 逐步被弃用,const 枚举和 ESM 模式替代
  4. AI 集成深化:TypeScript 的类型信息是 AI 辅助编程的理想输入,IDE 和 AI 工具深度依赖 TS 类型
  5. 生态系统统治地位:GitHub #1 编程语言,260 万+ 月活跃贡献者,年增长率 66%

未来路线图

时间事件
2026 年中/晚TypeScript 7.0 正式发布(Go 编译器)
未来typescript-go 仓库合并回 microsoft/TypeScript
持续新 TC39 提案的类型系统支持
持续类型感知 linting 与 tsgo/Oxlint 集成

社区活跃度

指标数值
GitHub Stars~109,478
npm 周下载量~2.115 亿
月活跃贡献者260 万+(2025 年底)
贡献者年增长率66%
GitHub 语言排名#1(超越 Python)
企业采用Pinterest 370 万行 Flow → TS 迁移

总体评价

TypeScript 已经从一个"可选的类型层"演变为 JavaScript 生态的基础设施语言。Go 重写版本(TypeScript 7)将解决长期被诟病的编译速度问题。结合 Node.js 原生 TypeScript 支持(类型剥离)和生态系统的统治地位,TypeScript 在可预见的未来将继续巩固其作为前端开发"标准配置"的地位。类型系统不仅是编译工具,更是现代 JavaScript 开发体验的核心支柱。