2017-09-15 91 views
0

我正在處理一些軟件包。他們導出類。一般概念是有一個定義數據存儲區行爲的核心包,然後是一個postgres包,它爲postgres實現一個數據存儲區,另一個使用redis存儲區實現相同的事物,等等。避免賦值錯誤與依賴關係的最佳做法?

我的問題是在我的依賴關係樹,因爲基本的數據存儲對rxjs的依賴,以及一些插件模塊參考rxjs的。所以:

+ node modules 
+ -- core 
    + rxjs 5.4.0 
+ -- postgres 
    + rxjs 5.4.1 

除非核心和Postgres模塊聲明對完全相同相同版本rxjs的依賴,這兩種不同的rxjs包不會得到重複數據刪除。

它們實際上是相同的版本,但它們不是。我明白了。我可以在那裏處理角落案件。問題是,我再也不能說

const pgstore: Store = new PostgresStore(); 

,因爲我根本無法分配PostgresStore(在我的Postgres包裝聲明)到通用存儲變量(在我的核心包申報),因爲有兩個不同的版本rxjs,因此Subject<string>我在商店中存儲爲私有屬性最終是兩種不同類型的主題,並且這些不可交叉指派。 (例如,編譯失敗,因爲「主題不能鍵入主題,有兩個不同類型的名稱存在,但它們是無關的。」)

我必須想象,這並不罕見。什麼是最佳實踐(構建依賴關係,依賴關係等)以避免這種掛斷?它基本上導致了一個非常脆弱的安裝,並且有一段時間,我不得不花費一個小時擺弄npm和我的package.json文件以正確地重複刪除東西(這也會干擾我使用npm link爲本地開發依賴項的能力包,因爲這使得重複更加困難)。

+0

嗯,似乎至少有一部分答案是:不要使用私有/受保護的成員。他們最終將打字稿從結構改爲主格打字(有效),這可以被看作是「正確但可怕」的行爲。 – pfooti

回答

0

一個特定的解決方案,概述here,是通過特別告訴打字稿來解決有問題的聲明需要什麼版本的東西。我已經更新了我tsconfig.json包括:

compilerOptions: { 
    "baseUrl": ".", 
    "paths": { 
    "@angular/*": ["node_modules/@angular/*"], 
    "rxjs": ["node_modules/rxjs"], 
    "plump": ["node_modules/plump"], 
    "rxjs/*": ["node_modules/rxjs/*"] 
    } 
} 

這似乎是解決自己的問題,現在 - 我仍然能夠使用npm link在我豐滿的模塊工作,沒有打字稿讓我非常難過。

讓問題暫時保留,因爲這裏可能有更好的答案。