是否可以重构 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
在单独的文件中,则需要导入 EntityModel
和 UserModel
而另外两个如果它们在单独的文件中,则需要导入 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;
这是一种更加打字的做事方式。
我在同一个 .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
在单独的文件中,则需要导入 EntityModel
和 UserModel
而另外两个如果它们在单独的文件中,则需要导入 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;
这是一种更加打字的做事方式。