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'. Property 'then' eksisterer ikke på typen 'false'.

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

Relaterte artikler