我想做这样的事情:
type A = { a: string; b: number; c: boolean };
type B = ["b", "a"];
type C = MapProps<A, B> ?? // [number, string]
Run Code Online (Sandbox Code Playgroud)
我能得到的最接近的是:
type C = {[key in B[number]]: A[key]}
Run Code Online (Sandbox Code Playgroud)
但这会产生一个对象,而我想丢弃键并仅将值保留为元组,其顺序与B. 即,有Object.values()类型级别的东西吗?
我们需要在这里使用递归条件类型。逻辑如下:
在每次迭代中,我们从 中获取第一个 element( K)B并将其存储A[K]在某个 result( R) 数组中。我们继续这个直到B为空,然后返回R。
执行:
type MapProps<
T,
Keys extends PropertyKey[],
Result extends unknown[] = []
> = Keys extends [
infer First extends keyof T,
...infer Rest extends PropertyKey[]
]
? MapProps<T, Rest, [...Result, T[First]]>
: Result;
Run Code Online (Sandbox Code Playgroud)
PropertyKey是任何键的内置类型:string | number | symbol.
为了从数组类型中获取第一个和其余元素,我们使用了infer关键字。
测试:
type A = { a: string; b: number; c: boolean };
type B = ["b", "a"];
type C = MapProps<A, B>; // [number, string]
Run Code Online (Sandbox Code Playgroud)