从TypeScript导入CommonJS的最兼容方式是什么?
以下三种从TypeScript导入CommonJS模块的方法:从TypeScript导入CommonJS的最兼容方式是什么?,typescript,commonjs,es6-modules,Typescript,Commonjs,Es6 Modules,以下三种从TypeScript导入CommonJS模块的方法: import*作为foo从“foo”导入 import foo=require(“foo”) const foo=require(“foo”) 哪个与TS和ES模块规格最兼容 也就是说,当/如果“foo”库切换到使用ES模块时,上述哪项最不可能破坏或变得怪异 更新:(1)看起来最好,因为它是真正的ES模块语法,但我关心的是保留我们正在导入的CommonJS模块的预期语义。例如,如果在导入模块时预期会运行副作用,我们希望在使用impo
import*作为foo从“foo”导入
import foo=require(“foo”)
const foo=require(“foo”)
import*时将该语义作为
语法保留
另一个更新:我们的目标是ES模块。一个单独的工具完成ES模块->转换
这是最糟糕的一个,foo
将被键入任何类型,我将不惜一切代价避免它
import foo = require("foo")
这是typescript特定的导入语法,应该尽可能避免。在运行时,它被编译为var foo=require(“foo”)
,但在编译时它提供了类型安全性。这是导入使用导出分配的模块的唯一方法
import * as foo from "foo"
这是ES2015的官方语法,应尽可能采用这种语法(出口分配情况除外,我认为它可用于所有其他情况)
如果编译为commonjs
,则上述语法在运行时仍将被转换为const foo=require(“/foo”);
,因此其行为方式应相同
需要注意的是,typescript不会发出未使用的导入和仅用于其类型(读取)的导入,因此,如果要导入模块以产生副作用,可以使用以下语法:
import "foo"
但是,您推荐的选项没有问题吗?(选项1)。例如,语义是否与选项3完全匹配?我担心的是,当模块被多次导入时,是否会产生副作用。将此添加到问题中。@MaxHeiber在运行时,如果您将
commonjs
,import*作为foo fromfoo“
仍将是const foo=require(“/foo”);
但如果模块未使用,则可能会被删除,我将添加到答案中。我们希望针对ES
import "foo"