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
通常当我创建 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