提问人:Prasanna 提问时间:11/10/2023 更新时间:11/16/2023 访问量:42
“SubConstructor”可以分配给类型为“B”的约束,但“B”可以使用约束“BaseConstructor”的不同子类型进行实例化
'SubConstructor' is assignable to the constraint of type 'B', but 'B' could be instantiated with a different subtype of constraint 'BaseConstructor'
问:
我是泛型的新手,我做了一个设计,我们使用泛型,这样它增加了代码的灵活性。但就我而言,我有一个奇怪的问题,即出现上述错误。我的要求是,我希望能够将值从基类的子类传递到基类,以便在基类中执行操作并将值返回给子类。我在这里附上了我的代码片段。操场
在这里,您可以找到错误并帮助我重构代码,以便我可以在基本级别引入所有操作,或者帮助我解决此错误,并提供针对我的情况的任何解决方法。
答:
0赞
Turtle
11/10/2023
#1
错误消息可能是对您的解释:
类型“SubConstructor”不能分配给类型“B”。 “SubConstructor”可分配给类型为“B”的约束,但“B”可以使用约束“BaseConstructor”的不同子类型进行实例化。
我在这里切断了通用约束。不确定,它是否真的对你的上下文有帮助:
export abstract class Base {
protected prop1: BaseConstructor|undefined;
}
export class SubBase extends Base {
constructor() {
super()
this.prop1 = new SubConstructor('Here')
}
}
export class BaseConstructor {
protected id!: number
}
export class SubConstructor extends BaseConstructor{
// some properties
subProp1: string = ''
constructor(subProp1: string) {
super()
this.subProp1 = subProp1
}
}
export class SubBaseChild extends SubBase {
constructor() {
super()
}
}
export class SubBaseChildConstructor extends BaseConstructor {
subChildProp: number = 0
constructor(subChildProp: number) {
super()
this.subChildProp = subChildProp
}
}
0赞
Prasanna
11/15/2023
#2
可以通过传递一个可选的泛型来代替 subBase 类来解决此问题。我附上了代码供您参考。我已经添加了 所需区域的评论,以便将来对某人有所帮助
export abstract class Base<T extends BaseConstructor> {
protected prop1: T|undefined;
}
export class SubBase<B extends BaseConstructor> extends Base<SubConstructor | B> { // add optional generic here as the super class doesnt know which type to pass but the child class very well knows
constructor() {
super()
this.prop1 = new SubConstructor('Here')
}
}
export class BaseConstructor {
protected id!: number
}
export class SubConstructor extends BaseConstructor{
// some properties
subProp1: string = ''
constructor(subProp1: string) {
super()
this.subProp1 = subProp1
}
}
export class SubBaseChild extends SubBase<SubBaseChildConstructor> {
constructor() {
super()
}
}
export class SubBaseChildConstructor extends BaseConstructor {
subChildProp: number = 0
constructor(subChildProp: number) {
super()
this.subChildProp = subChildProp
}
}
希望这会对你有所帮助
评论