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代码>?当然谢谢。关于类型别名的更多信息可以在这里找到:一般来说,我主要使用类型别名来更好地记录参数和属性。它们从来都不是应用程序的基础。