typescript3.0 - Cómo 'mapear' una tupla a otro tipo de tupla en Typescript 3.0
Tengo una tupla de tipos Maybe:
class Maybe<T>{ }
type MaybeTuple = [Maybe<string>, Maybe<number>, Maybe<boolean>];
y quiero convertir esto en una tupla de tipos:
type TupleIWant = [string, number, boolean];así que probé esto:
type ExtractTypes<T> = T extends Maybe<infer MaybeTypes>[] ? MaybeTypes : never;
type TypesArray = ExtractTypes<MaybeTuple>; // string | number | boolean NOT [string, number, boolean]
Lo cual no funciona :-(
Obtengo (string | number | boolean)[] en lugar de la tupla que quiero: [string, number, boolean]
¿Es lo que quiero hacer actualmente posible?
Respuesta #1
Necesitarás usar un tipo de tupla mapeada, que es compatible con TypeScript 3.1.
Puedes crear un tipo mapeado que tenga propiedades 0, 1, 2 y length de los tipos correctos, así:
class Maybe<T> {}
type MaybeTuple = [Maybe<string>, Maybe<number>, Maybe<boolean>];
type MaybeType<T> = T extends Maybe<infer MaybeType> ? MaybeType : never;
type MaybeTypes<Tuple extends [...any[]]> = {
[Index in keyof Tuple]: MaybeType<Tuple[Index]>;
} & {length: Tuple['length']};
let extractedTypes: MaybeTypes<MaybeTuple> = ['hello', 3, true];
Si estás usando una versión anterior de TypeScript, puedes usar una versión no lanzada de TypeScript, o como solución temporal, puedes escribir un tipo condicional para hacer coincidir con tuplas mientras creas que es probable que tengas, por ejemplo, así.
