typescript - Hur kan jag behålla generisk typinferens när jag tilldelar en typ med flera generiska med standardvärde?


Jag definierar en funktion med flera generiska typer och ger dem standardtyper. Till exempel:

function fun<A = any, B = any>(a: A, b: B) {
  return [a, b] as const;
}

Om jag inte tilldelar dem några typer, kommer generics att härledas korrekt.

let a: number;
let b: string;
const res = fun(a, b);  // [number, string]

Men om jag tilldelar en viss typ till en del av dem, kommer de övriga generiska att härledas av deras standardtyper.

let a: number;
let b: string;
const res = fun<number>(a, b);  // [number, any]

Hur kan jag tilldela vissa generiska typer samtidigt som jag låter resten av de generiska typerna härledas själva?

Lekplatslänk

Svar #1

Jag skulle inte tro att detta kommer upp särskilt ofta, vanligtvis kommer a att ha önskad typ så det finns ingen anledning att uttryckligen ange ett typargument. Men i de fall där du vill att resultatet ska vara av en annan typ än a (förmodligen en supertyp), är lösningen som kommer i åtanke att använda as istället för ett typargument.

Här är ett exempel:

type NumList = 42 | 67;

declare let a: NumList;
declare let b: string;
const res1 = fun(a, b);  // [NumList, string]

const res2 = fun(a as number, b);  // [number, string]
//                ^^^^^^^^^^

Lekplatslänk

Generellt försöker jag undvika typförsäkringar, men det är i princip vad det skulle innebära att ange typargumentet ändå, och åtminstone om typförsäkringen är helt fel kommer det att misslyckas, till exempel:

declare let a2: string;
const res3 = fun(a2 as number, b);
//               ^^^^^^^^^^^^−−−−−−− error

Lekplatslänk