映射对象类型是一种独特的对象类型,它能够将已有的对象类型映射为新的对象类型,例如我们想要将某个对象类型中所有属性修改为只读属性,我们除了直接修改以外,更好的处理办法就是使用映射对象类型将原对象类型映射到一个新的对象类型
映射对象类型解析
类型K必须能够赋值给联合类型 string | number | boolean
- 若当前遍历出来的类型成员P为字符串字面量类型,则在对象类型中创建一个新的属性成员,属性名类型为该字符串字面量并且属性值类型为T ```typescript type T = ‘x’ | ‘y’; type K = number;
type Mapped = { readonly [P in K]?: T };
/
{
readonly x?: number,
readonly y?: number
}
/
- 若当前遍历出来的类型成员P为数字字面量类型,则在结果对象类型中创建一个新的属性成员,属性名类型为该数字字面量类型且属性值类型为T```typescripttype T = 1 | 2;type K = number;type Mapped = { readonly [P in K]?: T };/*{readonly 1?: number,readonly 2?: number}*/
- 若当前遍历出来的类型成员P为unique symbol类型,则在结果对象类型中创建一个新的属性成员,属性名类型为该unique symbol类型且属性值类型为T ```typescript const s: unique symbol = Symbol(); type T = boolean;
type Mapped = { [P in typeof s]: T }; / { [s]: boolean } /
- 若当前遍历出来的类型成员P为number类型,则在结果对象类型中创建数值索引签名```typescripttype K = number;type T = boolean;type Mapped = { [P in K]: T };/*{[prop: number]: boolean}*/
- 若当前遍历出来的类型成员P为string类型,则在结果对象类型中创建字符串索引签名 ```typescript type K = string; type T = boolean; type Mapped = { [P in K]: T }; /* {
} */
<a name="6GiUG"></a># 示例- 复制```typescripttype T = { a: number, b: string };type Mapped = { [P in keyof T]: T[P] };
- 修改为只读,可选 ```typescript type T = { a: number, b: string };
type Mapped = { readonly [P in keyof T]?: T[P] };
<a name="M2oSD"></a># 内置工具- Parial<T>- 将传入的所有属性标记为可选属性```typescripttype T = { a: number, b: string };type Mapped = Partial<T>;
- Readonly
- 将传入的所有属性标记为只读属性 ```typescript type T = { a: number, b: string };
type Mapped = Readonly
<a name="m8H54"></a># 同态映射对象类型- 映射后的对象类型结构与源对象类型T的结构完全一致,我们将这种对象类型称为同态映射对象类型```typescript{ readonly [P in keyof T]?: X }
- readonly和?修饰符都是可选的 ```typescript type T = { a?: number, b: string };
type K = keyof T;
// 同态映射对象类型 // { a?: number, b: string } type Mapped1 = { [P in keyof T]: T[P] }
// 非同态映射对象类型 // { a: number | undefined, b: string } type Mapped2 = { [P in K]: T[P] }
<a name="mBAqb"></a># 添加和移除修饰符```typescript{ -readonly [P in keyof T]-?: T[P] }{ +readonly [P in keyof T]+?: T[P] }
- 如果要将已有对象类型的所有属性转换为必选属性,则可以用Required
```typescript type T = { a?: number, b?: number };
type Mapped = Required
