我正在使用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"
]
}
答案 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";