从TypeScript导入CommonJS模块的以下三种方法中:
import * as foo from "foo
import foo = require("foo")
const foo = require("foo")
哪个与TS和ES模块规范最兼容?
就是说,当/如果“ foo”库切换为使用ES模块时,以上哪一项最不可能破坏或变得怪异?
更新:(1)看起来最好,因为它是真正的ES模块语法,但是我担心保留我们要导入的CommonJS模块的预期语义。例如,如果预期在导入模块时会产生副作用,那么我们希望在使用
import * as
语法时保留该语义。另一个更新:我们的目标是ES模块。 ES模块->转换是一个单独的工具。
答案 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"