Result will be created, when creating I need to add A and B_plus (possibly other extended classes) and will new an Object in other js files. There is no way to use module in this project.
If the above problems cannot be solved, what is a better way to achieve my goal?
const Namespace = {};
{
class Result {}
class A {
a;
}
class B {
b;
}
class B_Plus extends B {
bplus;
}
class Builder {
/**
* @instance
*/
result;
constructor() {
this.result = new Result();
}
/**
*
* @param {A} a
*/
addA(a) {
this.result = Object.assign(this.result, { a });
return this;
}
/**
*
* @param {B} b
*/
addB(b) {
this.result = Object.assign(this.result, { b });
return this;
}
build() {
return this.result;
}
}
Namespace.Result = Result;
Namespace.A = A;
Namespace.B = B;
Namespace.B_Plus = B_Plus;
Namespace.Builder = Builder;
/**
* after build, I get {Result}.
* this is the way I find to define the type
* @type {Result & {a: A, b: B_Plus}}
*/
let result1 = new Builder()
.addA(new A())
.addB(new B_Plus())
.build();
}
/**
* dont know how to get correct type
* at least be {Result} of {Namespace.Result}
* but I get {typeof Result}
* @type {typeof Namespace.Result}
*/
let result2 = new Namespace.Builder()
.addA(new Namespace.A())
.addB(new Namespace.B_Plus())
.build();
console.log(result2);