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