2024-03-10·10 min read

TypeScript 高级类型系统

探索 TypeScript 的高级类型特性和实际应用

TypeScript类型系统前端

TypeScript 高级类型系统

TypeScript 的类型系统是其最强大的特性之一。本文将介绍一些高级类型技巧。

泛型(Generics)

泛型让我们能够编写可重用的组件:

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

// 使用
const num = identity<number>(42);
const str = identity<string>("hello");

条件类型

条件类型允许我们根据条件选择类型:

type IsString<T> = T extends string ? true : false;

type A = IsString<string>;  // true
type B = IsString<number>;  // false

映射类型

映射类型可以基于旧类型创建新类型:

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

type Partial<T> = {
  [P in keyof T]?: T[P];
};

实用工具类型

TypeScript 提供了许多内置的工具类型:

Pick

从类型中选择一组属性:

interface User {
  id: number;
  name: string;
  email: string;
  age: number;
}

type UserPreview = Pick<User, 'id' | 'name'>;
// { id: number; name: string; }

Omit

从类型中排除一组属性:

type UserWithoutEmail = Omit<User, 'email'>;
// { id: number; name: string; age: number; }

Record

构造一个对象类型:

type Roles = 'admin' | 'user' | 'guest';
type RolePermissions = Record<Roles, string[]>;

类型守卫

类型守卫帮助我们缩小类型范围:

function isString(value: unknown): value is string {
  return typeof value === 'string';
}

function processValue(value: string | number) {
  if (isString(value)) {
    // value 被缩小为 string 类型
    console.log(value.toUpperCase());
  } else {
    // value 被缩小为 number 类型
    console.log(value.toFixed(2));
  }
}

infer 关键字

infer 允许我们在条件类型中推断类型:

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

type Result = ReturnType<() => string>; // string

模板字面量类型

TypeScript 4.1 引入了模板字面量类型:

type EventName<T extends string> = `on${Capitalize<T>}`;

type ClickEvent = EventName<'click'>; // 'onClick'
type ChangeEvent = EventName<'change'>; // 'onChange'

总结

TypeScript 的高级类型系统提供了强大的工具来确保代码的类型安全。通过掌握这些高级特性,我们可以:

  • 编写更安全的代码
  • 提供更好的开发体验
  • 减少运行时错误
  • 提高代码的可维护性

继续探索和实践这些类型特性,将帮助你成为更优秀的 TypeScript 开发者。