2017-02-23 3 views
1

Ich verwende Visual Studio 2015 und Typescript 2.0.3.0.Typescript erzwingt keine Eingabe beim Zurückgeben eines generischen Objekts aus einer abstrakten Funktion

Ich habe ein ziemlich einfaches Vererbungsmodell, bei dem meine Basisklasse eine abstrakte Methode hat, die eine Promise zurückgibt.

Wie Sie sehen können, verwendet die Basisklasse Generika, um den Typ des Modells einzuschränken, das die Unterklassen verwenden, in diesem Fall TModel.

Wenn ich eine abstrakte Methode deklariere, GetVehicle, die TModel zurückgibt, wird Typescript meine Unterklasse (GrandPrix) zwingen, den Typ "Car" zurückzugeben - das ist großartig.

Wenn ich jedoch den Rückgabetyp Promise ändern, Typoskript erzwingt nicht mehr den Rückgabetyp:

interface IVehicle { 
    Name:string; 
} 

class Car implements IVehicle { 
    Name: "CAR"; 
} 

class MotorBike implements IVehicle { 
    Name: "MotorBike"; 
} 


abstract class Race<TModel extends IVehicle> { 

    protected abstract GetVehiclePromise(): Promise<TModel>; 
    protected abstract GetVehicle(): TModel; 
} 

class GrandPix extends Race<Car> { 
    // This works - it has to be type 'Car' 
    protected GetVehicle(): Car { return null; } 

    // This works, but SHOULD NOT - I can return Promise<anything_at_all> and it still compiles. Even something non-IVehicle like Promise<string> 
    protected GetVehiclePromise(): Promise<MotorBike> { return null; } 
} 

Von Interesse habe ich auch versucht, die Verwendung von Versprechen mit einer anderen Klasse zu ersetzen, die ein generischen akzeptiert - gleiches Problem:

class Simple<T> { 
    ID: ""; 
} 

abstract class Race<TModel extends IVehicle> { 
    protected abstract GetVehiclePromise(): Simple<TModel>; 
} 

class GrandPix extends Race<Car> { 
    // Also compiles when it should not 
    protected GetVehiclePromise(): Simple<MotorBike> { return null; } 
} 

das ist also kein Problem mit dem Versprechen <> Erklärung ist es mit Generika zu tun (ich glaube).

Vielen Dank im Voraus!

Antwort

1

Das erste Beispiel wird wie erwartet in Typescript 2.2 (wahrscheinlich auch 2.1) fehlschlagen, ich glaube, das war aufgrund dieser issue mit Promises in Typescript.

Das zweite Beispiel kompiliert, weil TypScript Typkompatibilität mit generics behandelt, insbesondere verwendet Simple<T> nicht das Argument type.

Wenn Sie die folgende Änderung vornehmen Sie würde die erwartete Fehlermeldung erhalten:

class Simple<T> { 
    ID: T; 
} 
+0

Ja, du hast Recht! Das Upgrade half bei der ersten Ausgabe. Und danke für die Klärung der zweiten. Ein echter Red-Hering, ich habe ein potenzielles Problem mit Versprechungen abgewiesen, als ich das zweite Problem als Manifest sah. – Ben

Verwandte Themen