TypeScript

从零开始学习 TypeScript:类型系统的力量

JavaScript 的灵活性是一把双刃剑——它让你快速构建原型,但也让大型项目的维护变成噩梦。TypeScript 通过静态类型系统,在编译阶段捕获错误,让代码更可靠、更易维护。

为什么选择 TypeScript?

TypeScript 是 JavaScript 的超集,添加了可选的静态类型。它的核心价值在于:

  • 编译时错误检测:在运行前发现类型不匹配、属性缺失等问题
  • 更好的 IDE 支持:自动补全、重构、跳转定义都更加精准
  • 自文档化:类型即文档,新成员能快速理解 API 契约
  • 渐进式采用:可以逐步将 .js 文件迁移为 .ts

基础类型

TypeScript 内置了丰富的类型系统。以下是一些核心概念:

// 基本类型
let name: string = "Alex";
let age: number = 28;
let isActive: boolean = true;

// 数组与元组
let tags: string[] = ["typescript", "javascript"];
let tuple: [string, number] = ["score", 100];

// 接口定义对象结构
interface User {
  id: number;
  name: string;
  email?: string; // 可选属性
}

// 联合类型
type Status = "pending" | "active" | "archived";

泛型:编写可复用的类型安全代码

泛型是 TypeScript 最强大的特性之一。它允许你编写与类型无关、但保持类型安全的代码:

function identity<T>(arg: T): T {
  return arg;
}

// 使用
const num = identity(42);        // 推断为 number
const str = identity("hello");   // 推断为 string

// 泛型约束
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): T {
  console.log(arg.length);
  return arg;
}

工具类型

TypeScript 内置了许多实用的工具类型,可以基于现有类型派生新类型:

  • Partial<T>:将所有属性变为可选
  • Required<T>:将所有属性变为必填
  • Pick<T, K>:从 T 中选取部分属性
  • Omit<T, K>:从 T 中排除部分属性
  • Record<K, V>:构造键值对类型
「类型系统不是为了限制你,而是为了在正确的抽象层次上给你自由。」

实践建议

  1. strict: true 开始,不要妥协类型安全
  2. 优先使用 interface 定义对象,用 type 定义联合类型
  3. 避免滥用 any,用 unknown 替代需要动态处理的场景
  4. 善用类型推断,不必为每个变量显式标注类型

TypeScript 的学习曲线确实存在,但回报是显著的。一旦习惯了类型思维,你会发现自己写的 JavaScript 代码质量也会自然提升。