2016-02-23 101 views
2

我注意到很多環境聲明文件declare a namespace a module只是輸出命名空間,通常使用一些我不明白的體操。例如,在react.d.ts你看到這一點:爲什麼環境聲明使用名稱空間和模塊?

declare namespace __React { 

    ... entire API of the react library ... 

} 

declare module "react" { 
    export = __React; 
} 
  1. 爲什麼既是namespacemodule?爲什麼不直接在庫裏面聲明庫API呢?
  2. 爲什麼命名叫__React而不是簡單地React?這似乎是一個相當尷尬的「不要用我」的名字,但IntelliJ IDEA已經將我的源代碼全部導入,它似乎工作。

回答

6

此模式用於支持UMD libraries

如果通過<script ...>標記加載這些庫,通常會將某些內容放入全局範圍,但如果通過像RequireJS,CommonJS或SystemJS這樣的模塊系統調用,則會將某些內容返回給模塊加載程序。

在打字稿,這意味着如果你import'react'的模塊,你應該如果引用全局標識符React得到同樣的類型。

大多數定義文件只是寫自己的.d.ts文件,使得模塊的形狀和全局變量總是同時存在;該陣營的作者不喜歡,你可以不小心參考全球React如果你使用一個模塊加載器(在這種情況下,全局實際上不會出現),所以它們分離出來聲明放到__React,單獨.D。 ts文件聲明一個全局調用React,和一個模塊聲明"react"

+0

謝謝,這是一個非常明確的解釋,這一切現在是有道理的!有趣(煩人)是IntelliJ IDEA的總是想'導入組件= __React.Component',而不是從「反應」'即使我使用''模塊進口{}組件:commonjs'。對於接口,比如'進口MouseEventHandler = _React.MouseEventHandler'它的作品,我猜是因爲該接口是不是在編的JS引用的符號,但對於其他的東西,我得到'找不到變量:__React'。我猜IDE在這裏可能會更聰明一些。 – Aaron

相關問題