Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从TypeScript导入CommonJS的最兼容方式是什么?_Typescript_Commonjs_Es6 Modules - Fatal编程技术网

从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

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

  • import*作为foo从“foo”导入
  • import foo=require(“foo”)
  • const foo=require(“foo”)
  • 哪个与TS和ES模块规格最兼容

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

    更新:(1)看起来最好,因为它是真正的ES模块语法,但我关心的是保留我们正在导入的CommonJS模块的预期语义。例如,如果在导入模块时预期会运行副作用,我们希望在使用
    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"