混合TypeScript和Meteor - 跨多个文件的类

时间:2015-03-18 06:23:13

标签: javascript meteor typescript

对任何不正确的术语表示歉意。对于那些不熟悉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#应用程序那样对待它。

5 个答案:

答案 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)

我已在bloghere处理此问题。我决定使用邪恶的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文件。

改为使用https://atmospherejs.com/universe/modules

答案 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
});