簡體   English   中英

帶有繼承的Typescript編譯器錯誤通用類型

[英]Typescript compiler error generic type with inheritance

由於output變量中存在鍵入錯誤,因此以下代碼無法編譯:

輸入'{item:ModelInterface; }”不能分配給“ ResponseInterface”類型。 屬性“ item”的類型不兼容。 類型“ ModelInterface”不可分配給類型“ T”。

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

但是它看起來像個錯誤,我丟失了一些東西,或者打字稿編譯器在這種情況下完全失敗了?

我已經在打字稿游樂場試過了,但是也失敗了。

任何想法?

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類型的屬性項, ModelInterfaceExtended具有屬性nameage getModel無法創建此類對象,因為其返回類型為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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM