由于output变量中的键入错误,因此以下代码无法编译:



interface ModelInterface {

}

interface ResponseInterface<T> {
    item: T;
}

class Store {
    get<T extends ModelInterface>(): ResponseInterface<T> {
        let output: ResponseInterface<T> = {
            item: this.getModel()
        };
        return output;
    }

    getModel(): ModelInterface {
        return null;
    }
}
get方法显式定义T将始终扩展ModelInterface,为什么我不能在没有错误的情况下将显式ModelInterface对象设置为item

我可以通过执行以下操作来克服此错误:

let output: ResponseInterface<T> = {
    item: this.getModel() as T
};

但是它看起来像个错误,我丢失了一些东西,或者 typescript 编译器在这种情况下完全失败了?

我已经尝试过typescript playground,但是也失败了。

任何想法?

最佳答案

TModelInterface扩展而来的事实确实确保了可以将任何T实例“投射”到ModelInterface。但这并不意味着其他。

例如:

class ModelInterface
{
    public name: string;
}

interface ResponseInterface<T> {
    item: T;
}

class ModelInterfaceExtended
{
    public name: string;
    public age: number;
}

class Store
{
    get<T extends ModelInterface>(): ResponseInterface<T> {
        let output: ResponseInterface<T> = {
            item: this.getModel()
        };
        return output;
    }

    getModel(): ModelInterface {
        return null;
    }
}

const s = new Store();
let result = s.get<ModelInterfaceExtended>();

此处result将具有ModelInterfaceExtended类型的属性项,其属性为nameagegetModel无法创建此类对象,因为其返回类型为ModelInterface-仅带有name

您可以通过以下更改来修复它:
class ModelInterface
{
    public name: string;
}

interface ResponseInterface<T> {
    item: T;
}

class ModelInterfaceExtended
{
    public name: string;
    public age: number;
}

class Store<T extends ModelInterface>
{
    get(): ResponseInterface<T>
    {
        return {
            item: this.getModel()
        };
    }

    getModel(): T
    {
        return null;
    }
}

const s = new Store();
let result = s.get();

关于typescript - 有继承的Typescript编译器错误通用类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44627118/

10-11 21:17