2016-12-31 56 views
0

我有那些TypeScript類在相同的.ts文件,因爲有導入依賴關係。我將不勝感激,如果有人可以幫助我重構代碼,所以我可以去掉進口的循環引用:TypeScript中的這個循環依賴可以被重構,因此單獨的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文件的方式。

謝謝!

回答

2

這裏的技巧是將循環依賴關係分離到他們自己的模塊中。我會將所有的fromJson方法提取到一個新的模塊中。然後,我會將fromJson轉換成類似ModelFactory的類,因爲它現在更類似於工廠模式。所以,最終的結果會是這個樣子:現在

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

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

,我也看到你作爲any鍵入json對象。當你似乎至少知道這種類型的一些屬性時,這似乎有點寬泛。我試圖爲json對象創建一個接口,如下所示:

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

type UUID = number; 

這是一種更有效的做事方式。

+0

謝謝!我有這種感覺,我需要像你建議的工廠一樣添加一個新班級!感謝接口的提示/ json :) Btw什麼是'''類型UUID =編號;'''在最後?新年快樂! –

+1

這只是一個類型別名。當你有一個類似於UID的東西時,它恰好是一個數字,但實際上它只是一個技術細節,並且它有自己的語義,所以你經常使用一個類型別名。這可確保您只能在預期的地方使用UID,並且您不會意外傳遞香草編號。 –

+0

對我來說'''uuid'''雖然是一個字符串!我仍然可以這樣做:'''輸入UUID = string;'''?謝謝 –

相關問題