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

Mapping list of fields of a type to array type

我有一个类型

type MyType = {
  x: number
  y: string
}

我想要一种类型(例如 Mapper),它可以将字段列表转换为如下类型

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

这样构造TypeOfArray

效果相同
type TypeOfArray = [number, string]

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

是的,我可能会这样写:

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

这采用类型 T 和键 KS 的 object/array,并使新的 object/array 与 KS 具有相同的形状,但具有值替换为 T 中相应的 属性(如果没有相应的 属性,则替换为 never)。自 TS3.1 以来是 mapping over KS, which also works for tuples

重要的一点可能是嵌套的property lookup typeT[KS[K]]。对于 KS 的每个键 K,我们采用 KS[K] 属性,我们希望它是 T 的某个键,(这将是 MyType 在你的情况下),并在 T 中查找它以获得 T[KS[K]]。如果TMyTypeKS["x","y"]K"0",那么KS[K]"x"T[KS[K]]T["x"]number

那么你的Mapper就像

type MyType = {
  x: number
  y: string
}

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

您可以看到它按预期工作:

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

不确定这是否满足您的所有用例,但它应该能让您了解如何继续。好的,希望有所帮助;祝你好运!

Link to code