这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战
映射对象
映射对象中我们可以将一个已有的对象类型映射为一个新的对象类型。映射对象类型能够遍历联合类型并以联合类型成员作为属性名类型去构造一个对象类型。其中readonly关键字表示是否为只读属性,如果想可选的可以使用关键字?,遍历使用in关键字。其中k表示遍历的类型。P表示类型表示,用来表示每次遍历出来的成员类型。T表示任意类型,表示对象属性的类型。而且我们可以在类型T中使用类型P。其中类型K可以赋值给number、string、symbol联合类型。
{ readonly [P in K]? : T }
当遍历的类型成员为字面量类型、unique symbol类型、string类型、number类型时,就会在结果对象类型中创建一个新的属性成员,属性名为对应字面量类型,而且属性值的类型为T。
在同态映射对象类型中新的对象类型会默认拷贝源对象类型中所有属性readonly修饰符和?修饰符。如果是非同态映射对象类型,新的对象类型就不会拷贝源对象类型中所有属性readonly修饰符和?修饰符。下面例子中Z对象类型是映射对象类型但不是同态映射对象类型,因为语法中没有使用索引类型查询。而且非同态映射对象类型不会从源对象类型T中拷贝属性修饰符。例子中的x,y都没有修饰符。当映射对象类型再操作已知对象类型的所有属性或部分属性时会拷贝属性修饰符到映射对象类型中。
type T = { x?: string; readonly y: number };
type K = keyof T;
type Z = { [P in K]: T[P] };
同态映射对象类型写法如下,同态映射对象类型一般会保留对象类型X中属性的修饰符。如果T为联合类型,那么联合类型的每个成员类型求同态映射对象类型,并使用每个结果类型构造一个联合类型。如果T为原始类型,就不会进行任何映射。如果T是数组类型,那么同态映射对象类型也为数组类型。如果T是只读数组,那么同态映射对象类型也是只读数组类型。如果T为元组或者只读元组类型,那么同态映射对象也为元组或者只读元组类型。
{ [Z in keyof X]: Y }
type HMOT<T, X> = { [P in keyof T]: X }