将类型的字段列表映射到数组类型

时间:2019-11-20 01:10:39

标签: typescript typescript-generics

我的类型是

type MyType = {
  x: number
  y: string
}

我想要一种将字段列表转换为如下类型的类型(例如Mapper

type TypeOfArray = Mapper<['x', 'y']>

以这种方式构造TypeOfArray

具有相同的作用
type TypeOfArray = [number, string]

在Typescript 3.5中可能吗?我一直在玩映射元组,但无济于事

1 个答案:

答案 0 :(得分:2)

是的,我可能会这样写:

type GenericMapper<T, KS> = {
  [K in keyof KS]: KS[K] extends keyof T ? T[KS[K]] : never
};

这将使用类型T和键KS的对象/数组,并使新的对象/数组具有与KS相同的形状,但其值将替换为相应的属性来自T(如果没有对应的属性,则返回never)。是mapping over KS,自TS3.1起也是works for tuples

重要的一点可能是嵌套的property lookup typeT[KS[K]]。对于K的每个键KS,我们采用KS[K]属性,我们希望它是T的某个键,(它将为MyType (在您的情况下),然后在T中进行查找以获取T[KS[K]]。如果TMyType,并且KS["x","y"],并且K"0",则KS[K]是{{1} },而"x"T[KS[K]]T["x"]

然后您的number就像

Mapper

您会看到它按预期运行:

type MyType = {
  x: number
  y: string
}

type Mapper<KS> = GenericMapper<MyType, KS>;

不确定这是否满足您的所有用例,但希望它可以给您一个思路,以进行下一步。好的,希望能有所帮助;祝你好运!

Link to code