从抽象函数

时间:2017-02-23 03:06:42

标签: generics typescript abstract

我正在使用Visual Studio 2015和Typescript 2.0.3.0。

我有一个非常简单的继承模型,其中我的基类有一个返回Promise的抽象方法。

如您所见,基类使用泛型来限制子类正在使用的模型类型,在本例中为TModel。

当我声明一个返回TModel的抽象方法GetVehicle时,Typescript将强制我的子类(GrandPrix)返回类型“Car” - 这很棒。

但是,如果我将返回类型更改为Promise,则Typescript将不再强制执行返回类型:

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

有趣的是,我也尝试将Promise的使用替换为接受泛型的另一个类 - 同样的问题:

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

所以这不是Promise&lt;&gt;的问题声明,它与泛型(我认为)有关。

提前致谢!

1 个答案:

答案 0 :(得分:1)

第一个例子将在Typescript 2.2(也可能是2.1)中按预期失败,我相信这是由于这个issue在Typescript中有Promise。

第二个示例是由于TypeScript如何处理与generics的类型兼容性而编译的,特别是Simple<T>不使用type参数。

如果进行以下更改,您将收到预期的错误:

class Simple<T> {
    ID: T;
}