2017-06-19 86 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