TypeScript 高级类型模式

条件类型

条件类型允许我们根据类型关系创建新类型:

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

type A = IsString<'hello'>; // true
type B = IsString<42>;      // false

分布式条件类型

当条件类型用于泛型时,会自动分布:

type ToArray<T> = T extends unknown ? T[] : never;

type Result = ToArray<string | number>;
// string[] | number[]

映射类型

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

type Optional<T> = {
  [K in keyof T]?: T[K];
};

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

type ReadonlyUser = Readonly<User>;

模板字面量类型

TypeScript 4.1 引入的模板字面量类型让字符串类型的操作变得极其强大。

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

type Event = {
  [K in EventName]: () => void;
};

实战:类型安全的 API 客户端

type ApiResponse<T> = {
  data: T;
  error: null;
} | {
  data: null;
  error: string;
};

async function fetchApi<T>(
  url: string
): Promise<ApiResponse<T>> {
  try {
    const res = await fetch(url);
    const data = await res.json();
    return { data, error: null };
  } catch (e) {
    return { data: null, error: String(e) };
  }
}

总结

高级类型模式是 TypeScript 真正的威力所在。掌握它们,你将能构建出既灵活又安全的类型系统。