关于混合commonJS和ES6模块系统的几个问题

时间:2016-11-25 02:37:01

标签: typescript ecmascript-6 commonjs

我的问题是使用commonJS(节点样式)和ES6模块(使用typescript)。我有这个使用commonJS模块系统的1.5角应用程序。我试图使用typescript来创建应用程序中的一个工厂。几乎没有问题。

  1. 我们可以使用typescript import 关键字导入导出的模块 使用commonJS module.exports语法?例如,说我们有 我们希望在我们的打字稿文件中使用下面的RandomService.js。一世 注意到从一个导入*作为随机服务 ' ../../服务/ RandomService.js'扔了一些与之相关的错误 能够找到该模块。我通过使用a来实现这一点 require(),但只是想知道是否可以这样做 打字稿?

    var randomString = require('random-string');
    module.exports = {
        getSuperRandom: function() {
            var x = 'super-random-' + randomString();
            return x;
        }
    }
    
  2. 当我们从typescript文件中导出模块时通常会导出     object有一个保存我们对象的属性。甚至做出口     默认导致.default属性具有导出的对象。     无论如何我们可以将导出的对象直接设置为     export对象(就像我们在commonJS模块系统中可以做到的那样)     我们做module.exports =' helloservice')?

1 个答案:

答案 0 :(得分:2)

  1. 是的,它可以导入用javascript编写的commonJS模块,但前提是打字稿编译器可以找到这些模块的declarations
  2. 例如,如果您在module1.js中使用此javascript模块:

    exports.f = function(s) {
        return s.length
    }
    

    您必须提供描述模块的声明文件,并在文件module1.d.ts中定义其导出的类型:

    export declare function f(s: string): number;
    

    然后您可以将此模块与import一起使用。如果将此代码放在test.ts文件中的module1.d.ts所在目录中,则Typescript会找到导入的模块:

    import * as module1 from './module1';
    
    let n: number = module1.f('z');
    

    如果使用--module=commonjs(这是默认值)编译此代码,您将获得非常正常的commonjs代码:

    "use strict";
    var module1 = require('./module1');
    var n = module1.f('z');
    
    1. 如果您的模块导出某个对象,例如此module2.js

       module.exports = {
           a: 'a',
           n: 1
       };
      
    2. 最好避免使用es6语法导入它 - es6总是假设模块导出命名空间,而不是对象。在typescript中,有一种称为import require的特殊语法:

      import m2 = require('./module2');
      
      let n1: string = m2.a;
      

      声明文件module2.d.ts必须使用export assignment语法:

      export = {} as {a: string, n: number};
      

      实际值{}在声明文件中无关紧要,可以是任何内容 - 只有类型很重要(作为未命名接口的类型转换)。

      如果模块导出字符串,如示例所示,声明可以像

      一样简单
      export = '';