2017-02-23 39 views
1

我正在使用Visual Studio 2015和Typescript 2.0.3.0。從抽象函數返回泛型時,Typescript不強制執行打字

我有一個非常簡單的繼承模型,其中我的基類有一個抽象方法返回一個Promise。

如您所見,基類使用泛型來限制子類使用的模型的類型,在本例中爲TModel。

當我聲明一個返回TModel的抽象方法GetVehicle時,Typescript將強制我的子類(GrandPrix)返回類型「Car」 - 這太棒了。

但是,如果我改變返回類型的諾言,打字稿將不再強制執行的返回類型:

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

有趣的是,我自己也嘗試與接受通用的另一個類替換使用無極 - 同樣的問題:

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

因此,這是不符合承諾<>聲明一個問題,它與泛型(我想)做。

在此先感謝!

回答

1

第一個例子在Typescript 2.2中可能會失敗(可能是2.1),我認爲這是由於帶有Promises in Typescript。

第二個示例因爲TypeScript處理與generics的類型兼容性而編譯,特別是Simple<T>未使用type參數。

如果您做如下改變,你會得到預期的錯誤:

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

是的,你說得對!升級對第一個問題有幫助。謝謝你澄清第二條。一個真正的紅色鯡魚,我看到第二個問題的表現後,就駁回了承諾的潛在問題。 – Ben

相關問題