TypeScript系统模块未注册导入的文件位置

时间:2015-11-25 17:00:21

标签: typescript systemjs typescript1.6

问题

我正在使用TypeScript v.1.6.2使用ES5和system模块将我的ts源代码编译成js。我的期望是JS有一个system.register填充了表示导入的源位置的字符串数组。例如:

System.register(['angular2/angular2', 'angular2/router', 'angular2/http'], 
    function(exports_1) { ...

但是,在我的情况下,system.register 为空。我不确定为什么它是空的,但我显然不能没有任何进口。下面是我的文件结构,示例源代码和我的tsconfig.json的草图。

文件结构

  |index.js
  |
  |components
     |
     |--Bike
        |
        -Bike.ts

来源

/// <reference path="components/Bike/Bike.ts" />

import { Bike } from 'components/Bike/Bike';

export class TestClass {

    public bike: Bike;

    constructor(bike: Bike) {

        this.bike = bike;

        console.log('Bike new TestClass');

    }

}

...

export class Bike {

    constructor() {

        console.log('new bike');

    }

}

输出

/// <reference path="components/Bike/Bike.ts" />

  //NOTICE - no locations in the registry!

System.register([], function(exports_1) {
    var TestClass;
    return {
        setters:[],
        execute: function() {
            TestClass = (function () {
                function TestClass(bike) {
                    this.bike = bike;
                    console.log('Bike new TestClass');
                }
                return TestClass;
            })();
            exports_1("TestClass", TestClass);
        }
    }
});

tsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "module": "system",
        "declaration": true,
        "removeComments": false,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "listFiles": true,
        "outDir": "target/js"
    },
    "exclude": [
        "node_modules",
        "jspm_packages",
        "bower_components",
        "d3",
        "plottable",
        "angular2",
        "target"
    ]
}

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。问题是,您只使用类型Bike进行声明。您不会在类Bike(例如静态函数)上调用任何内容,也不会将Bike作为参数等传递。因此,无需在已编译的javascript文件中导入Bike(至少从编译器的角度或创建编译器的typescript-team)

但我找到了一个解决方案:编译器选项emitDecoratorMetadata:true确保将导入Bike。这里是https://github.com/Microsoft/TypeScript/wiki/Compiler-Options的描述:

  

在源中为装饰声明发出设计类型元数据。有关详细信息,请参阅issue #2577

我希望这会有所帮助。

答案 1 :(得分:-2)

  

就我而言,system.register为空。我不确定为什么它是空的,

只能得到你import 的内容。

E.g。要将angular2/angular2作为依赖项,您需要以下内容:

import * as angular2 from "angular2/angular2";