Búsqueda de sitios web

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í.

Artículos relacionados