[英]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
};
但是它看起來像個錯誤,我丟失了一些東西,或者打字稿編譯器在這種情況下完全失敗了?
我已經在打字稿游樂場試過了,但是也失敗了。
任何想法?
T
從ModelInterface
擴展的事實確實確保可以將任何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
具有屬性name
和age
。 而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.