javascript - Definiera returtyp när parameter är ett visst värde


Jag har två definitioner som är exakt samma, men jag skulle vilja att den första returnerade Promise<Cursor<T>> när värdet på limit är större än 1, och den andra ska returnera Promise<T> om värdet på limit är 1. Hur skulle jag definiera detta, är det möjligt att definiera eller finns det ett annat sätt att definiera det?

public async select<T extends any>(limit: number): Promise<Cursor<T>>

public async select<T extends any>(limit: number): limit is 1 && Promise<T>

public async select<T extends any>(...args: any[]): Promise<T | Cursor<T>> {
  // Do query and return the Pomise
}

Svar #1

Du kan använda en numerisk literaltyp i din överlagring för att uppnå önskad effekt:

class Cursor<T>{}
class O {

    public async select<T extends any>(limit: 1): Promise<T>
    public async select<T extends any>(limit: number): Promise<Cursor<T>>


    public async select<T extends any>(...args: any[]): Promise<T | Cursor<T>> {
        return null as any

    }
}
let o = new O();
let s = o.select(1) // Promise<{}>
let m = o.select(2) // Promise<Cursor<{}>>

Detta kommer dock endast att fungera om du skickar konstanten 1 till funktionen, och kan orsaka mer förvirring än vad det är värt.

let n = 1;
o.select(n);//  n is a number so it's types as a Promise<Cursor<{}>> 
const constOne = 1;
o.select(constOne);// Promise<{}>