Typescript: deklarer returtype til å være avhengig av argumentverdi?


Jeg har følgende funksjonskall:

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

Er det mulig å definere get-funksjonen på en måte som gjør at returtypen bestemmes av verdien til funksjonsargumentet. I mitt tilfelle returnerer 'get' Barcode-klassen hvis den kalles med 'barcode' og Mqtt-klassen hvis den kalles med 'mqtt'.

Svar #1

Ja, du kan bruke overbelastning på strenger for å gjøre dette. Eksempel:

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 er ikke mulig å statisk bestemme en type ut fra en (dynamisk) streng. Men generiske typer er laget for disse tilfellene.

Eksempel :

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

Jeg er ikke sikker på at jeg forstår problemet med Ember, men hvis metoden get dynamisk settes inn i objektet, så kan kanskje en løsning som dette:

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();
    }
}

Relaterte artikler