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