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
