typescript - Härled tuplet-typ istället för unionstyp
Vet någon hur man får kompilatorn att automatiskt härleda tuple-typen?
// Now: (string | number)[]
// Wanted: [string, number][]
const x = [ ["a", 2], ["b", 2] ];
Svar #1
Du kan nu använda det nyligen tillagda as const för att uppnå detta:
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
Svar #2
Detta kan göras om vi använder en extra funktion för att hjälpa typinferens lite:
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][]
Redigera
Bättre version med färre överskridanden:
const tupleArray = <T extends ([any] | any[])[]>(args: T): T => args
tupleArray([["A", 1], ["B", 2]]) // [string, number][]
Du kan lägga till fler överbelastningar om du behöver fler än 3 objekt i tuple.
