将类型的字段列表映射到数组类型
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 type、T[KS[K]]
。对于 KS
的每个键 K
,我们采用 KS[K]
属性,我们希望它是 T
的某个键,(这将是 MyType
在你的情况下),并在 T
中查找它以获得 T[KS[K]]
。如果T
是MyType
,KS
是["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]
不确定这是否满足您的所有用例,但它应该能让您了解如何继续。好的,希望有所帮助;祝你好运!
我有一个类型
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 type、T[KS[K]]
。对于 KS
的每个键 K
,我们采用 KS[K]
属性,我们希望它是 T
的某个键,(这将是 MyType
在你的情况下),并在 T
中查找它以获得 T[KS[K]]
。如果T
是MyType
,KS
是["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]
不确定这是否满足您的所有用例,但它应该能让您了解如何继续。好的,希望有所帮助;祝你好运!