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
