簡體   English   中英

用於導入 commonjs / amd 模塊的新 es6 語法,即`import foo = require('foo')`

[英]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

來自該功能的設計師

  • 導出默認聲明始終聲明一個名為 default 的導出成員,並且始終作為對exports.default 的賦值發出。 換句話說, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM