2017-06-19 223 views
0

下面的代碼失敗,因爲在output可變打字錯誤的編譯:打字稿編譯器錯誤一般類型具有繼承

類型「{項:ModelInterface; }'不能分配給 'ResponseInterface'類型。財產'物品'的類型是不相容的。 類型'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 
}; 

但它看起來像一個bug,我失去了一些東西或打字稿編譯器只是在這種情況下會失敗呢?

我試過在typescript playground但它也失敗了。

有什麼想法?

回答

0

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將與屬性nameage類型ModelInterfaceExtended的屬性項。而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(); 
+0

謝謝您的回答,這非常有意義。然而,在我的真實情況下,事情並不像示例中那麼簡單。我的商店基類是按照你的例子定義的,但返回一個'ModelInterface'的方法是在'ModelInterface'接口本身定義的(稱爲'importValues'的方法返回一個'ModelInterface',因爲它唯一可以知道的類型)。但我現在明白爲什麼編譯器會返回一個錯誤,我爲此感謝你。 – Stnaire