2017-08-29 105 views
0

有了這個代碼通天編譯常量未定義

const noCurrencies: Map<CurrencyCode, Currency> = new Map(); 

/** 
* Reducer for the finished currency request. 
*/ 
export function currencies(state: Map<CurrencyCode, Currency> = noCurrencies, action: Action): Map<CurrencyCode, Currency> { 
    switch (action.type) { 
    case SET_CURRENCIES: 
     return action.currencies; 

    default: 
     console.log('currencies(reducer): noCurrencies', noCurrencies) 
     return state; 
    } 
} 

我得到這個控制檯輸出:

currencies(reducer): noCurrencies undefined 

這是一個已知的問題與巴別塔?我如何調試它?我有一種感覺,這是由於這個特定的文件在初始化過程中被調用過兩次,因此與另一個文件有循環依賴關係。

(我不是'從零開始重新創建一個repro',所以不要提示,並且類型是https://github.com/flowtype/flow-typed,它在預處理器步驟中被刪除,並且我嘗試了沒有類型的結果相同)

+0

看那transpiler輸出調試作出反應的意見和類型。 – Bergi

+0

在'const'初始化之前你有可能調用函數嗎? (Babel沒有實現TDZ) – Bergi

+0

是的,循環依賴(儘管不完全導致雙重初始化)將具有這種行爲。 – Bergi

回答

0

原因是模塊之間存在大的循環依賴關係。即使使用ECMAScript模塊語法,編譯器(WebPack 3 + babel)也不夠聰明,僅在需要時才加載需要的內容;但是每當使用/觸摸文件時,都要評估全部的導出和導入。

這意味着,如果你有index.js文件寬鬆從他們身邊出口的事情,創造一個單一入口點爲它的文件夾外來電,你可能會遇到這樣的問題。

我不得不通過代碼庫,並通過將導入直接導入索引文件的周圍文件,而不是導入「深層」。

E.g.

  • 夾甲
    • epics.js
    • commands.js
    • index.js
    • types.js
    • actions.js
    • reducers.js
    • 消息.js
    • ...
  • 文件夾B
    • import { create } from '../A'成爲import { create } from '../A/types'
    • 等等所有的東西;最終我只出口從index.js