Typescript 将键数组映射到属性数组

Ada*_* B. 2 typescript

我想做这样的事情:

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()类型级别的东西吗?

won*_*ame 5

我们需要在这里使用递归条件类型。逻辑如下:

在每次迭代中,我们从 中获取第一个 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)

操场