Búsqueda de sitios web

typescript - Inferir tipo de tupla en lugar de tipo unión


¿Alguien sabe cómo hacer que el compilador infiera automáticamente el tipo de tupla?

// Now: (string | number)[]
// Wanted: [string, number][]
const x = [ ["a", 2], ["b", 2] ];

Respuesta #1

Ahora puedes usar el recientemente añadido as const para lograr esto:

const x = [ ["a", 2], ["b", 2] ] as const;
// Type is
// readonly [readonly ["a", 2], readonly ["b", 2]]

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions

Respuesta #2

Esto se puede hacer si usamos una función extra para ayudar un poco a la inferencia de tipos:

function tupleArray<T1, T2, T3>(arr:[T1, T2, T3][]) : typeof arr 
function tupleArray<T1, T2>(arr:[T1, T2][]) : typeof arr 
function tupleArray<T1>(arr:[T1][]) : typeof arr 
function tupleArray(arr:any[]) : any[]{
    return arr;
}

var t = tupleArray([ ["a", 2], ["b", 2] ]) // [string, number][]

Editar

Mejor versión con menos sobreescrituras:

const tupleArray = <T extends ([any] | any[])[]>(args: T): T => args
tupleArray([["A", 1], ["B", 2]]) // [string, number][]

Puedes agregar más sobrecargas si necesitas más de 3 elementos en la tupla.

Artículos relacionados