对任何不正确的术语表示歉意。对于那些不熟悉Meteor的人,it has a well-defined order of script loading。我尝试创建包含课程的许多*.ts
个文件,就像您在C#的*.cs
文件中看到的那样。我想在彼此之间引用这些*.ts
文件,最终来自main.ts
。
编译Car.ts:
class Car {
constructor(public age: number) { }
}
生成Car.js:
var Car = (function () {
function Car(age) {
this.age = age;
}
return Car;
})();
使用Meteor,我想要以下输出:
Car = (function () {
function Car(age) {
this.age = age;
}
return Car;
})();
因此可以从另一个文件main.ts:
引用Car/// <reference path="car.ts"/>
Meteor.startup(function () {
console.log(Car); // Hopefully prints [Function: Car]
var a: Car = null; // Compiles
});
我可以通过修改Car.ts来接近:
declare var Car;
class Car_ {
constructor(public age: number) {}
}
Car = Car_;
但这会产生一个愚蠢的输出:
var Car_ = (function () {
function Car_(age) {
this.age = age;
}
return Car_;
})();
Car = Car_;
需要一个kludgy main.ts:
/// <reference path="car.ts"/>
Meteor.startup(function () {
console.log(Car); // Prints [Function: Car_]
var a: Car_ = new Car(); // Yuck!
});
有什么建议吗?我可能会像C#应用程序那样对待它。
答案 0 :(得分:1)
一种解决方案涉及设置全局对象:
class Car {
constructor(public age: number) {}
}
global.Car = Car;
编译为:
var Car = (function () {
function Car(age) {
this.age = age;
}
return Car;
})();
global.Car = Car;
我对此解决方案不满意,因为global
是特定于nodejs的东西,并且不能在使用window
的浏览器中工作。结果是this
在浏览器和服务器上都有效:
class Car {
constructor(public age: number) {}
}
this.Car = Car;
编译为:
var Car = (function () {
function Car(age) {
this.age = age;
}
return Car;
})();
this.Car = Car;
不雅,但更好......
答案 1 :(得分:0)
我昨天遇到了同样的问题。 我正在使用meteortypescript,它给了我同样的问题(似乎它不允许与包一起正常工作)。
我切换到另一个编译器脚本,现在一切正常。 这是:mologie:typescript,。
我没有看到解决第一个问题的方法,但我偶然发现了两个编译器插件的作者之间的讨论,这可能解释了一些差异: https://github.com/mologie/meteor-typescript/issues/1
可能会有所帮助
答案 2 :(得分:0)
我已在blog和here处理此问题。我决定使用邪恶的eval
命令,因为它给了我最简单的使用模块的可能性,直到出现更复杂的东西。
档案/lib/foo.ts
。它位于子目录中,因为它必须在Bar之前加载,因为它扩展了Foo。
eval('var Hugo = (this.Hugo || (this.Hugo = {})'); // this will override the automatically emitted var Hugo and assigns it with globally defined Hugo module
module Hugo {
export class Foo {
foo():string {
return 'foo'
}
}
}
档案/bar.ts
/// <reference path="lib/foo.ts"/>
eval('var Hugo = (this.Hugo || (this.Hugo = {})'); // this will override the automatically emitted var Hugo and assigns it with globally defined Hugo module
module Hugo {
export class Bar extends Foo {
bar () : string {
return 'bar';
}
}
}
档案/test.ts
/// <reference path="lib/foo.ts"/>
/// <reference path="bar.ts"/>
var m = new Hugo.Bar();
console.log(m.bar());
console.log(m.foo());
如前所述,对于类,解决方案甚至更简单:
class ExportedClass {
variable : int;
}
this.ExportedClass = ExportedClass;
答案 3 :(得分:0)
废弃TS和Meteor只会运行.js文件。
答案 4 :(得分:-1)
我可能会像C#应用程序那样对待它。
是。从var
移除var Car
在这种特殊情况下没有变化(两者都是全局的)。
以下工作正常。只需将car.ts
移动到子文件夹中:
/// <reference path="./foo/car.ts"/>
Meteor.startup(function () {
console.log(Car); // Hopefully prints [Function: Car]
var a: Car = null; // Compiles
});