typescript - Returner Promise eller boolean avhengig av parametrene med en standardverdi
Jeg har noe kode som enten vil returnere en boolean eller en Promise avhengig av parameterne.
function setGuid<B extends boolean>(guid: string, shouldValidate?: B): B extends true ? boolean : Promise<boolean>
function setGuid(guid: string, shouldValidate?: boolean): boolean | Promise<boolean> {
if (shouldValidate){
return true
}
return Promise.resolve(true);
}
Denne funksjonaliteten fungerer. Hvis jeg kaller setGuid("*", false), forstår den at returtypen vil være en Promise<boolean>, på samme måte hvis jeg kaller setGuid("*", true), forstår TypeScript at returtypen vil være en boolean.
Problemet er at jeg ikke kan finne ut hvordan jeg setter en standard returtype, som er Promise<boolean> hvis shouldValidate (en valgfri parameter) ikke er oppgitt - jeg vil at TypeScript skal forstå at setGuid("*") vil returnere Promise<boolean>. For øyeblikket, hvis jeg ikke eksplisitt gir false som den andre parameteren, tror det at boolean | Promise<boolean> returneres.
Feilen jeg får når jeg kaller setGuid("*") er Property 'then' eksisterer ikke på typen 'boolean | Promise
All hjelp vil bli satt stor pris på, takk!
Svar #1
Hvis du ikke sender inn noe som shouldValidate, er det ingenting for kompilatoren å bruke for å utlede typen til B. Dermed vil den ha en tendens til å bruke standardverdien for begrensningen, som er boolean. Dette har dårlig oppførsel siden B extends true ? boolean : Promise<boolean> vil bli forent til boolean | Promise<boolean>, som du har sett.
I dette tilfellet kunne du legge til en generisk parameterstandard til overbelastningskall-signaturen, slik:
function setGuid<B extends boolean = false>(
guid: string,
shouldValidate?: B
): B extends true ? boolean : Promise<boolean>;
Kompilatoren vil bruke denne standardverdien hvis den ellers ikke kan utlede B:
setGuid("*").then(x => x ? 0 : 1); // no error now
Ok, håper det hjelper; lykke til!
Lenke til kode på lekeplassen
