[英]New es6 syntax for importing commonjs / amd modules i.e. `import foo = require('foo')`
以前我可以這樣做:
import foo = require('foo');
但是現在 TypeScript (1.5) 支持 es6 模塊語法,在 ES6 模塊語法中實現相同的正確方法是什么。
正確的方法是繼續使用舊的導入語法。 新的導入語法僅適用於 ES 模塊,舊的導入語法適用於 ES6 之前的模塊。 兩者是不同的,故意如此。 import * as foo from 'foo'
導入模塊 'foo' 的所有屬性,它不會將默認值導入為foo
。
export default
始終具有 ES 模塊語義。 為了與 Babel 兼容,當模塊具有默認導出時,我們可以選擇發出__esModule
標記,但我們實際上不會將該標記用於任何事情。export =
聲明,它替換一個不同的實體來代替模塊本身,總是作為對module.exports
的賦值module.exports
。 在使用export =
的模塊中有其他導出是錯誤的。 這是現有的 TypeScript 行為。export =
導出另一個模塊(內部或外部模塊)的模塊可以使用新的 ES6 結構導入。 特別是,方便的解構導入可以與此類模塊一起使用。 使用export =
導出另一個模塊的模式在 .d.ts 文件中很常見,這些文件提供內部模塊的 CommonJS/AMD 視圖(例如 angular.d.ts)。export =
導出非模塊實體代替模塊本身的模塊必須使用現有的import x = require("foo")
語法import x = require("foo")
,就像今天的情況一樣。 2016 年更新: TypeScript 編譯器在某個時候開始允許import * as foo from 'legacy-module-foo'
在某些情況下獲取舊模塊的默認導入。 這違反了 ES6 規范(第15.2.1.16 節, “值“*”表示導入請求是針對目標模塊的命名空間對象。” )。
當您以這種方式導入的遺留模塊更新為 ES6 模塊時,這些模塊的“默認”導入將停止工作(因為* as foo
導入應該導入命名空間對象),如果您不這樣做,這可能會非常混亂知道這樣做是 TypeScript/SystemJS hack。 未來 TypeScript 對 ES 規范的重新調整也有可能導致它們崩潰。
因此,您可能更願意繼續使用上述的遺留導入語法來加載遺留模塊,以避免讓您自己和其他開發人員對 ES6 命名空間導入的工作方式感到困惑,並避免混淆破壞性更改。
ES6 模塊語法對應的語法是:
import * as foo from 'foo';
基本上將foo
模塊中的所有內容導入到名為foo
的局部變量中。
從TypeScript 2.7 開始,有一個新的esModuleInterop
標志可用於啟用 CommonJS/AMD/UMD 的默認導入。 通過在您的tsconfig.json
將該標志設置為true
,這應該可以按預期工作:
import foo from 'foo';
ES6 模塊實際上是具有新語法的 TypeScript 外部模塊:ES6 模塊是單獨加載的源文件,可能會導入其他模塊並提供許多外部可訪問的導出。 ES6 模塊具有幾個新的導出和導入聲明。 建議更新 TypeScript 庫和應用程序以使用新語法,但這不是必需的。
據我了解,這意味着鼓勵您將自己的 TypeScript 模塊遷移到新語法,但繼續使用import foo = require('foo')
來導入實際的 AMD/CommonJS 模塊。
全部導入,
const foo = require("foo");
如果它是一個文件,這將從包“foo”中導入所有實例
const foo = require("./foo");
因此您可以通過調用foo.InstanceName
來訪問每個實例
如果要導入特定實例,
import MyInstance from "foo";
所以這將從“foo”導入特定實例(Myinstance),您仍然可以使用上述方法導入所有實例,
import * as ReferenceName from "foo";
它相當於,
const ReferenceName = require("foo");
另一種選擇是使用 CommonJS 語法導入它:
const foo = require("foo");
TypeScript 和 Babel 都同意如何處理這個問題。 此外,如果您無論如何要編譯到 ES5 或更少,那么這與最終形式不會相差太遠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.