如何为 SystemJS 导出 TypeScript 模块?

How to export a TypeScript module for SystemJS?

在我的网站上,我想使用 SystemJS 导入 FancyModule,以便我可以创建此模块导出的 类 实例。

所以我想要实现的是这个(在 ECMAScript 2015 兼容网站中):

SystemJS.import('MyFancyModule').then(function(MyFancyModule) {
  var myFancyInstance = new MyFancyModule.MyFancyClass('Test');
  console.log(myFancyInstance.text);
});

不幸的是,我收到以下错误:

TypeError: MyFancyModule.MyFancyClass is not a constructor(…)

这是我的 TypeScript 模块:

export module MyFancyModule {
  export class MyFancyClass {
    public text: string;

    constructor(text: string) {
      this.text = text;
    }
  }
}

这是我的 TypeScript 编译器设置 (tsconfig.json):

{
  "compilerOptions": {
    "module": "system",
    "moduleResolution": "node",
    "outFile": "dist/browser/MyFancyModule.js",
    "rootDir": "src/ts",
    "target": "es5"
  }
}

它将我的 TypeScript 模块编译成:

System.register("MyFancyModule", [], function(exports_1, context_1) {
  "use strict";
  var __moduleName = context_1 && context_1.id;
  var MyFancyModule;
  return {
    setters: [],
    execute: function() {
      (function(MyFancyModule) {
        var MyFancyClass = (function() {
          function MyFancyClass(text) {
            this.text = text;
          }

          return MyFancyClass;
        }());
        MyFancyModule.MyFancyClass = MyFancyClass;
      })(MyFancyModule = MyFancyModule || (MyFancyModule = {}));
      exports_1("MyFancyModule", MyFancyModule);
    }
  }
});

对我来说 MyFancyModule 似乎已正确导出,但我不知道为什么我无法访问 MyFancyClass

Typescript 负责如何从它支持的不同模块系统加载模块。
这个想法是你有一个特定的语法(在打字稿中)并根据你指定给编译器的模块(例如在 tsconfig.json 中)它会根据选定的模块系统。

所以你需要做的就是:

import * as MyFancyModule from "MyFancyModule";

var myFancyInstance = new MyFancyModule.MyFancyClass('Test');
console.log(myFancyInstance.text);

编辑

编译器应该生成如下内容:

System.register(["MyFancyModule"], function(exports_1, context_1) {
    "use strict";
    var __moduleName = context_1 && context_1.id;
    var MyFancyModule;
    var myFancyInstance;
    return {
        setters:[
            function (MyFancyModule_1) {
                MyFancyModule = MyFancyModule_1;
            }],
        execute: function() {
            myFancyInstance = new MyFancyModule.MyFancyClass('Test');
            console.log(myFancyInstance.text);
        }
    }
});

如您所见,编译后的 js 中没有此 import from 语法的痕迹。

我想我成功地重现了你的例子。

看起来使用此设置,文件 - MyFancyModule.ts - 本身已经是一个模块。当你做

export module MyFancyModule {

您在其中创建了一个嵌套模块。

这段代码应该可以在其他一切不变的情况下工作:

    SystemJS.import('MyFancyModule').then(function(MyFancyModule) {
        var myFancyInstance = new MyFancyModule.MyFancyModule.MyFancyClass('Test');
        console.log(myFancyInstance.text);
    });

或者,您可以从 .ts 文件中删除 export module 并在顶层添加 export class - 然后您的原始导入将起作用。