【问题标题】:TypeScript immutable data/classes with mutual reference具有相互引用的 TypeScript 不可变数据/类
【发布时间】:2022-01-16 00:28:30
【问题描述】:

通常,当我创建 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类的实例,其中item属性设置为undefined,类实例化后分别分配引用。但是这个解决方案会破坏不变性,因为它允许用户覆盖 item 属性。

任何建议的解决方案?

【问题讨论】:

  • 我认为不可变的“打结”的唯一方法是推迟评估,这在 JS 中是不可能发生的,除非你用一个返回值的函数替换一个值。也许像this。这能满足你的需求吗? (编辑:看起来 ABOS 的回答正是这样说的)

标签: javascript typescript class immutability readonly


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多