我在BMW.ts中定义了一个名为BMW的课程如下:
///<reference path="../Thing.ts"/>
module Entities.Cars {
import e = Entities;
export class BMW extends Vehicle {
public series: string;
constructor ( model : string, series : string) {
super("BMW", model)
this.series = series;
}
drive() {
alert("driving a bimmer is a different kind of feeling");
}
toString() : string
{
return this.getName() + " " + this.series + " " + this.getType();
}
}
}
在另一个文件Thing.ts中,我将Vehicle和Thing类定义如下:
module Entities {
// Class
export class Thing {
private _name: string;
private _type: string;
// Constructor
constructor (public name: string, public type: string) {
this._name = name;
this._type = type;
}
getName(): string { return this._name; }
setName(name: string) { this._name = name; }
getType(): string { return this._type; }
setType(name: string) {
this._type = name;
}
toString() : string
{
return "Entities.Thing";
}
}
export class Vehicle extends Thing {
public cargoCapacity: number;
public fuelType: string;
public owner: string;
constructor (make: string, model : string) {
super(make, model)
}
drive() {
}
toString(): string {
return "Entities.Vehicle";
}
}
}
在我参考Thing和BMW TypeScript文件后尝试执行以下代码时:
var car = new Entities.Cars.BMW("335i", "E90");
car.drive();
我遇到以下错误的异常“Microsoft JScript运行时错误:无法获取属性'BMW'的值:对象为null或未定义”。生成的Javascript for BMW出错。我上面的片段有什么问题?
答案 0 :(得分:6)
您的代码没有任何问题,因此您生成的javascript
文件的导入顺序似乎是错误的。规范说明如下:
构成全局模块的源文件的初始化顺序最终取决于生成的JavaScript文件在运行时加载的顺序(例如,可以通过引用生成的JavaScript文件的标记来控制)
我生成了一个文件app.ts
,如下所示:
///<reference path='Things.ts'/>
///<reference path='bmw/BMW.ts'/>
var car = new Entities.Cars.BMW("335i", "E90");
car.drive();
此时您有两个选择:
让编译器通过生成单个输出文件来确定执行文件的正确顺序
tsc --out app.js app.ts
然后您只需要app.js
。
手动指定正确的订单。对我来说,以下是唯一有效且无错误的订单。
<html>
<head>
<script src="Things.js"></script>
<script src="bmw/BMW.js"></script>
<script src="app.js"></script>
</head>
<body>
</body>
</html>
答案 1 :(得分:0)
你的代码很好。
我的猜测是你没有正确地将脚本标签放在你的头部元素中(错误的顺序,或者省略一些)。
解决这个问题的最简单方法是,不必记住正确的声明序列是通过设置--out选项从tsc编译器使用单个.js输出文件。
编辑:根据您正在处理的js场景(WSH,Web应用程序或其他一些js环境),您需要以不同方式链接js源文件。 例如,使用wsh,您可以使用FileSystemObject读取源文件,然后对其进行评估。 或者你可以使用AMD ......