chengaofeng
发布于 2024-07-31 / 11 阅读
0
0

怎么理解typescript的类型映射?

TypeScript的类型映射(Mapped Types)是一种强大的特性,允许你基于现有类型创建新的类型。类型映射通常用于对类型进行批量操作,比如将所有属性设为可选、只读,或者将属性类型进行转换。

以下是一些常见的类型映射示例:

1. 基本类型映射

假设你有一个接口Person

interface Person {

  name: string;

  age: number;

  address: string;

}

你可以使用类型映射来创建一个所有属性都变为可选的类型:

type PartialPerson = {

  [P in keyof Person]?: Person[P];

};

PartialPerson类型等同于:

interface PartialPerson {

  name?: string;

  age?: number;

  address?: string;

}

2. 使用内置的类型映射工具

TypeScript提供了一些内置的类型映射工具,比如PartialReadonlyPickRecord

  • Partial<T>:将类型T的所有属性变为可选。

    type PartialPerson = Partial<Person>;
  • Readonly<T>:将类型T的所有属性变为只读。

    type ReadonlyPerson = Readonly<Person>;
  • Pick<T, K>:从类型T中选择一组属性K,构成新的类型。

    type NameAndAge = Pick<Person, 'name' | 'age'>;
  • Record<K, T>:构造一个类型,其属性名为K,属性值类型为T

    type StringRecord = Record<'name' | 'age' | 'address', string>;

3. 高级类型映射

你还可以使用条件类型和类型映射来创建更复杂的类型。例如,将所有属性类型转换为字符串:

type Stringify<T> = {

  [P in keyof T]: string;

};

type StringifiedPerson = Stringify<Person>;

StringifiedPerson类型等同于:

interface StringifiedPerson {

  name: string;

  age: string;

  address: string;

}

4. 条件类型映射

你可以结合条件类型来进行更复杂的映射。例如,将所有属性类型为string的属性变为可选:

type OptionalStringProperties<T> = {

  [P in keyof T]: T[P] extends string ? T[P] | undefined : T[P];

};

type OptionalStringPerson = OptionalStringProperties<Person>;

OptionalStringPerson类型等同于:

interface OptionalStringPerson {

  name?: string;

  age: number;

  address?: string;

}

总结

类型映射是TypeScript中非常强大的特性,允许你基于现有类型进行批量操作和转换。通过类型映射,你可以创建更灵活和可重用的类型定义,从而提高代码的可维护性和可读性。


评论