gpt4 book ai didi

angular - 在 Typescript 中重构循环依赖

转载 作者:行者123 更新时间:2023-12-03 23:11:01 27 4
gpt4 key购买 nike

我有一个 API 可以对导致循环依赖的数据进行非规范化。有没有办法使用抽象类、接口(interface)、组合或其他技术重构以下内容,而我不需要为每个实体创建 N 个部分类以避免在我的 Angular 应用程序的类型定义中出现循环依赖?

模型.ts

export abstract class Model {
// ... Model related data members and functions
}

个人.ts
import { Model } from './model';
import { Site } from './site';

export class Person extends Model {

// ... Data

site: Site; // Partially or Fully saturated site entity
}

网站.ts
import { Model } from './model';
import { Person } from './person';

export class Site extends Model {

// ... Data

people: Person[]; // array of partially saturated people entities, site is left undefined
}

我想为每个模型维护一个定义,而不是重新定义 Site , Person等每次有这样的依赖。

最佳答案

这个问题是由糟糕的类模型设计引起的,它不依赖于语言。我希望这有帮助 :)
循环依赖问题通常包括鸡和蛋问题,因为当您要实例化一个对象时,您不知道应该先实例化哪个对象。
解决方案 1
这个问题可以很容易地通过仅通过对象的身份引用对象来解决,而不是直接依赖于作为构造函数的一部分的大对象。例如修改 Person 类:

import { Model } from './model';

export class Person extends Model {

// ... Data

siteId: number;
}
解决方案 2
如果您需要 Person 内部的完整对象,我认为一个好的方法是更改​​继承树。
我了解您的数据模型是关于网站、其用户和所有者的。好吧,让我们分解一下:make Person一个抽象类并用 User 扩展它和 Owner类。
个人.ts
import { Model } from './model';

export abstract class Person extends Model {

// ... Data

// Does not include the Site attribute!
}
用户.ts Users将成为 Site 的“读者” ,但不需要引用它。
import { Person } from './person';

export class User extends Person {

// ... Data

}
所有者.ts Owner将成为 Site 的创建者.这是引用 Site 的类.
import { Person } from './person';

export class Owner extends Person {

// ... Data

site: Site;

}
网站.ts
最后, Site跟踪其用户。
import { Model } from './model';
import { User } from './user';

export class Site extends Model {

// ... Data

users: User[];
}
我认为这篇相关文章可能有助于理解循环依赖: How to fix nasty circular dependency issues once and for all in JavaScript & TypeScript

关于angular - 在 Typescript 中重构循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205192/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com