是否可以重构 TypeScript 中的这种循环依赖关系,以便可以使用单独的 TypeScript 文件?

Can this circular dependency in TypeScript be refactored so separate TypeScript files are possible?

我在同一个 .ts 文件中有那些 TypeScript 类,因为存在导入依赖项。如果有人可以帮助我重构代码,以便我可以删除导入的循环引用,我将不胜感激:

第一个是摘要GenericModel :

export abstract class GenericModel {
    nodeClass: string;
    id: string = "0";

    static fromJson(json: any): GenericModel {
        if (json.nodeClass === "Entity") {
            return EntityModel.fromJson(json);
        }
        else if(json.nodeClass === "User") {
            return UserModel.fromJson(json);
        }
        return null;
    }
}

另外两个 类 是 EntityModel(在下面列出)和 UserModel:

export class EntityModel extends GenericModel {
    nodeClass: string = "Entity";
    alias: string;
    description: string;

    constructor(public text: string, public id: string, public uuid: string, alias: string, public rand:string = "") {
       //[...]
    }

    //instance methods
    //[...]

    public static fromJson(json: any): EntityModel {
        var entity = new EntityModel(json.text, json.id, json.uuid, json.alias, json.rand);
        entity.description = json.description;

        if (json.types) {
            for (let type of json.types) {
                let objectifiedType: EntityModel = EntityModel.fromJson(type);
                entity.types.push(objectifiedType);
            }
        }
        if (json.innerEntities){
            for (let innerEntity of json.innerEntities) {
                let objectifiedInnerEntity: EntityModel = EntityModel.fromJson(innerEntity);
                entity.innerEntities.push(innerEntity);
            }
        }
        return entity;
    }
}

我在这里所做的是使用基于 nodeClass 的静态调用层次结构 fromJson() 对 JSON 进行反序列化。

很明显,如果 GenericModel 在单独的文件中,则需要导入 EntityModelUserModel 而另外两个如果它们在单独的文件中,则需要导入 GenericModel.

GenericModel --- has to import --> EntityModel, UserModel

EntityModel --- has to import --> GenericModel

UserModel --- has to import --> GenericModel

我想知道是否有一种方法可以重构代码,使其能够像现在一样工作,而且 类 位于单独的 .ts 文件中。

谢谢!

这里的技巧是将循环依赖隔离到它们自己的模块中。我会将所有 fromJson 方法提取到一个新模块中。然后我会将 fromJson 转换为 class ,称为 ModelFactory,因为这现在更类似于工厂模式。所以,最终结果看起来像这样:

export class ModelFactory {
  // maybe add a constructor for some configuration data, maybe not

  create(json: any) {
    ...
  } 
}

现在,我还看到您将 json 对象键入为 any。当您似乎至少知道该类型的一些属性时,这似乎有点宽泛。我会尝试为 json 对象创建一个接口,如下所示:

export interface ModelJson { // find a better name
  text?: string; 
  id?: number;
  uuid?: UUID; 
  alias?: string;
  rand?: number;
  ...
}

type UUID = number;

这是一种更加打字的做事方式。