通常,当我创建TypeScript应用程序时,我遵循OOP+不可变数据哲学。
假设我有两个相互参照的类,A类和B类。
class A {
public readonly item: B;
public constructor (item: B) {
this.item = item;
}
}
class B {
public readonly item: A;
public constructor (item: A) {
this.item = item;
}
}
现在不可能创建类A的实例,因为构造函数中需要类B来实现不变性,而类B需要类A的例子。
首先需要创建一个类A和B的实例,其中项属性设置为未定义,然后在类实例化后分别分配引用。但这个解决方案将打破不变性,因为它将允许用户覆盖项属性。
有任何建议的解决方案吗?
一种方法是使用getter来实现延迟评估,
class A {
private readonly _item: () => B;
public get item(): B {
return this._item();
}
public constructor(_item: () => B) {
this._item = _item;
}
}
class B {
public readonly _item: () => A;
public get item(): A {
return this._item();
}
public constructor(_item: () => A) {
this._item = _item;
}
}
const a: A = new A(() => b);
const b: B = new B(() => a);
console.log(a.item === b); // true