TypeScript 不可变 data/classes 具有相互引用

TypeScript immutable data/classes with mutual reference

通常当我创建 TypeScript 应用程序时,我遵循 OOP + 不可变数据哲学。

所以假设我有两个相互引用的 classes,class A 和 class 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;
    }
}

现在无法创建 class A 的实例,因为在构造函数中需要 class B 来实现不变性,并且 class B 需要 class A 的实例.

需要先创建classA和B的实例,属性项设置为undefined,然后在class实例化后分别赋值。但是这个解决方案会破坏不变性,因为它将允许用户覆盖项目 属性.

有什么建议的解决方案吗?

一种方法是使用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