Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript中的这种循环依赖关系是否可以重构,以便可以使用单独的TypeScript文件?_Typescript_Circular Dependency_Circular Reference - Fatal编程技术网

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

TypeScript中的这种循环依赖关系是否可以重构,以便可以使用单独的TypeScript文件?,typescript,circular-dependency,circular-reference,Typescript,Circular Dependency,Circular Reference,我将那些TypeScript类放在同一个.ts文件中,因为存在导入依赖项。如果有人能帮我重构代码,这样我就可以删除导入的循环引用,我将不胜感激: 第一个是抽象的GenericModel: export abstract class GenericModel { nodeClass: string; id: string = "0"; static fromJson(json: any): GenericModel { if (json.nodeClass

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

第一个是抽象的
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
位于单独的文件中,则需要导入
EntityModel
UserModel
而另外两个如果在单独的文件中,则需要导入
GenericModel

GenericModel---必须导入-->EntityModel,UserModel

EntityModel---必须导入-->GenericModel

UserModel---必须导入-->GenericModel

我想知道是否有一种方法可以重构代码,使其像现在一样工作,但类也在单独的.ts文件中


谢谢大家!

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

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

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

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

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

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

type UUID = number;

这是一种更为典型的方式。

这里的诀窍是将循环依赖项隔离到它们自己的模块中。我将把JSON的所有
方法提取到一个新模块中。然后我将
从JSON
转换成一个名为
ModelFactory
的类,因为这现在更类似于工厂模式。所以,最终的结果会是这样的:

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

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

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

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

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

type UUID = number;

这是一种更典型的做事方式。

谢谢!我觉得我需要添加一个新类,就像你建议的工厂一样!感谢界面提示/json:)顺便问一下,什么是
typeuuid=number在最后?新年快乐!这只是一个类型别名。当您有一个UID之类的东西,它恰好是一个数字,但实际上它只是一个技术细节,并且它有自己的语义时,您通常会使用类型别名。这确保了您只能在预期的情况下使用UID,并且不会意外地传入一个普通数字。但对我来说,
uuid
是一个字符串!我仍然可以这样做:
typeuuid=string?当然谢谢。关于类型别名的更多信息可以在这里找到:一般来说,我主要使用类型别名来更好地记录参数和属性。它们从来都不是应用程序的基础。谢谢!我觉得我需要添加一个新类,就像你建议的工厂一样!感谢界面提示/json:)顺便问一下,什么是
typeuuid=number在最后?新年快乐!这只是一个类型别名。当您有一个UID之类的东西,它恰好是一个数字,但实际上它只是一个技术细节,并且它有自己的语义时,您通常会使用类型别名。这确保了您只能在预期的情况下使用UID,并且不会意外地传入一个普通数字。但对我来说,
uuid
是一个字符串!我仍然可以这样做:
typeuuid=string?当然谢谢。关于类型别名的更多信息可以在这里找到:一般来说,我主要使用类型别名来更好地记录参数和属性。它们从来都不是应用程序的基础。