Typescript: deklarera returtyp att bero på argumentvärde?


Jag har följande funktionsanrop:

this.get('barcode').scan();

Är det möjligt att definiera get-funktionen på ett sätt som returntypen bestäms av värdet på funktionsargumentet. I mitt fall returnerar 'get' Barcode-klassen om den kallas med 'barcode' och Mqtt-klassen om den kallas med 'mqtt'.

Svar #1

Ja, du kan använda överbelastning på strängar för att göra detta. Exempel:

interface BarcodeScanner { scan(): number; }
interface Accelerometer { getAcceleration(): number; }

class MyClass {
    get(name: 'accelerometer'): Accelerometer;
    get(name: 'barcode'): BarcodeScanner;
    get(name: string): any; // Fallback string signature
    get(name: string): any { // Implementation signature, not visible
        /* ... */
        return undefined;
    }

    something() {
        let x = this.get('barcode');
        x.scan(); // OK
        let y = this.get('accelerometer');
        y.getAcceleration(); // OK
    }
}

Svar #2

Det är inte möjligt att statiskt bestämma en typ utifrån en (dynamisk) sträng. Men generiska typer är gjorda för dessa fall.

Exempel :

class MyClass {
    public get<T>(type: string): T {
        // ...
    }
    public anotherMethod() {
        this.get<Barcode>('barcode').scan();
    }
}

Jag är inte säker på att jag förstår problemet med Ember, men om metoden get dynamiskt införs i objektet, då kanske en lösning som denna:

class MyClass {
    public get: function<T> (type: string): T; // this is just a static declaration, there is no generated JS code here

    public anotherMethod() {
        this.get<Barcode>('barcode').scan();
    }
}

Relaterade artiklar