具有以下代码:
export interface IModel {
id: string;
}
export interface StatusResponse<
TModel extends IModel = IModel,
TResponse = any
> {
item: TModel;
response: TResponse;
}
export class Transport<TItem extends IModel = IModel> {
save(item: TItem): StatusResponse<TItem> {
const result: StatusResponse<TItem> = {
item: { // << error
id: ""
},
response: {
stat: "ok"
}
};
return result;
}
}
在save
函数内部,我收到此错误:
Type '{ id: string; }' is not assignable to type 'TItem'.
'{ id: string; }' is assignable to the constraint of type 'TItem', but 'TItem' could be instantiated with a different subtype of constraint 'IModel'.
什么是困惑我的是,该接口StatusResponse
具有通用相同的约束和缺省值TModel
作为类Transport
的TItem
但是,里面save
的功能,他们都表示不匹配。
如果我这样编写save
方法,就没有问题。
save(item: TItem): StatusResponse {
const result: StatusResponse = {
item: {
id: ""
},
response: {
stat: "ok"
}
};
return result;
}
请注意,我从中删除了通用类型,StatusResponse
因此它采用了默认值。
我不确定这是怎么回事。
想一想,如果将上述类与需要附加属性的通用参数一起使用,将会发生什么情况。例如:
new Transport<{ id: string, additionalProp: string }>()
保存方法将产生缺少结果的结果additionalProp
-这就是为什么您会收到错误消息。
不知道这是否适合您的情况,但是您可以将原始项目传播到响应中以保留类型结构:
export class Transport<TItem extends IModel = IModel> {
save(item: TItem): StatusResponse<TItem> {
const result: StatusResponse<TItem> = {
item: {
...item,
id: ""
},
response: {
stat: "ok"
}
};
return result;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句