“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'

提问人:Prasanna 提问时间:11/10/2023 更新时间:11/16/2023 访问量:42

问:

我是泛型的新手,我做了一个设计,我们使用泛型,这样它增加了代码的灵活性。但就我而言,我有一个奇怪的问题,即出现上述错误。我的要求是,我希望能够将值从基类的子类传递到基类,以便在基类中执行操作并将值返回给子类。我在这里附上了我的代码片段。操场

在这里,您可以找到错误并帮助我重构代码,以便我可以在基本级别引入所有操作,或者帮助我解决此错误,并提供针对我的情况的任何解决方法。

javascript angularjs 打字稿 angularjs-directive

评论


答:

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
    }
}

希望这会对你有所帮助

评论

0赞 Community 11/15/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。