由于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,但是也失败了。
任何想法?
最佳答案
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
类型的属性项,其属性为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();
关于typescript - 有继承的Typescript编译器错误通用类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44627118/