Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 从抽象函数返回泛型时,Typescript不强制键入_Generics_Typescript_Abstract - Fatal编程技术网

Generics 从抽象函数返回泛型时,Typescript不强制键入

Generics 从抽象函数返回泛型时,Typescript不强制键入,generics,typescript,abstract,Generics,Typescript,Abstract,我正在使用Visual Studio 2015和Typescript 2.0.3.0 我有一个非常简单的继承模型,其中我的基类有一个返回承诺的抽象方法 如您所见,基类使用泛型来限制子类使用的模型类型,在本例中是TModel 当我声明一个返回TModel的抽象方法GetVehicle时,Typescript将强制我的子类(GrandPrix)返回类型“Car”——这很好 但是,如果我将返回类型更改为Promise,Typescript将不再强制执行返回类型: interface IVehicle

我正在使用Visual Studio 2015和Typescript 2.0.3.0

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

如您所见,基类使用泛型来限制子类使用的模型类型,在本例中是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; }
}
接口车辆{
名称:字符串;
}
汽车类{
名称:“汽车”;
}
二级摩托车{
名称:“摩托车”;
}
抽象阶级竞赛{
受保护的抽象GetVehiclePromise():承诺;
受保护的抽象GetVehicle():TModel;
}
GrandPix级扩展了种族{
//这是可行的-它必须是“汽车”类型
受保护的GetVehicle():Car{return null;}
//这是可行的,但不应该——我可以回报承诺,但它仍然可以编译。即使是一些非IVehicle类的承诺
受保护的GetVehiclePromise():承诺{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; }
}
简单类{
ID:“”;
}
抽象阶级竞赛{
受保护的抽象GetVehiclePromise():简单;
}
GrandPix级扩展了种族{
//也会在不应编译时编译
受保护的GetVehiclePromise():简单{return null;}
}
所以这不是承诺声明的问题,而是泛型的问题(我认为)


提前谢谢

第一个示例将如Typescript 2.2(可能也是2.1)中预期的那样失败,我相信这是由于Typescript中的承诺

第二个示例之所以编译,是因为TypeScript如何处理与的类型兼容性,特别是
Simple
不使用类型参数

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

class Simple<T> {
    ID: T;
}
简单类{
ID:T;
}

是的,你说得对!升级有助于解决第一个问题。感谢您对第二个问题的澄清。一个真正的红鲱鱼,当我看到第二个问题出现时,我就用承诺排除了一个潜在的问题。