Búsqueda de sitios web

TypeScript mapear un arreglo de claves a un arreglo de propiedades


Me gustaría hacer algo así:

type A = { a: string; b: number; c: boolean };
type B = ["b", "a"];

type C = MapProps<A, B> ?? // [number, string]

Lo más cerca que puedo llegar es:

type C = {[key in B[number]]: A[key]}

Pero eso resulta en un objeto, mientras que me gustaría descartar las claves y solo mantener los valores como una tupla, con el mismo orden que B. Es decir, ¿hay algo como Object.values() a nivel de tipo?

Respuesta #1

Necesitaremos usar tipos condicionales recursivos aquí. La lógica es la siguiente:

En cada iteración, obtenemos el primer elemento (K) de B y almacenamos A[K] en algún arreglo de resultados (R). Continuamos esto hasta que B esté vacío y luego devolvemos R.

Implementación :

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;

PropertyKey es un tipo incorporado para cualquier clave: string | number | symbol.

Para obtener el primer y el resto de los elementos del tipo de arreglo usamos la palabra clave infer.

Prueba :

type A = { a: string; b: number; c: boolean };
type B = ["b", "a"];

type C = MapProps<A, B>; // [number, string]

parque infantil