从TypeScript导入CommonJS的最向前兼容的方法是什么?

时间:2019-01-30 17:37:08

标签: typescript commonjs es-module

从TypeScript导入CommonJS模块的以下三种方法中:

  1. import * as foo from "foo
  2. import foo = require("foo")
  3. const foo = require("foo")

哪个与TS和ES模块规范最兼容?

就是说,当/如果“ foo”库切换为使用ES模块时,以上哪一项最不可能破坏或变得怪异?

  

更新:(1)看起来最好,因为它是真正的ES模块语法,但是我担心保留我们要导入的CommonJS模块的预期语义。例如,如果预期在导入模块时会产生副作用,那么我们希望在使用import * as语法时保留该语义。

     

另一个更新:我们的目标是ES模块。 ES模块->转换是一个单独的工具。

1 个答案:

答案 0 :(得分:1)

const foo = require("foo")

这是最糟糕的一个,foo将被键入为任意一个,我会不惜一切代价避免

import foo = require("foo")

这是打字稿特定的导入语法,应再次避免。在运行时,它被编译为var foo = require("foo"),但是在编译时,它提供了类型安全性。这是导入使用导出分配的模块的唯一方法。

import * as foo from "foo"

这是ES2015的官方语法,在可能的情况下应优先使用(我认为导出分配的情况除外,我认为它可以在所有其他情况下使用)。

如果您编译为commonjs,则上述语法在运行时仍将编译为const foo = require("./foo");,因此其行为应相同。

有一个警告,打字稿将不会发出未使用的导入和仅用于其类型的导入(读here),因此,如果要导入具有副作用的模块,可以使用此语法:

import "foo"