2

我在 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’的值:对象为空或未定义”的异常。为 BMW 生成的 Javascript 有错误。我上面的代码片段有什么问题?

4

2 回答 2

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();

此时,您有两个选择:

  1. 让编译器通过生成单个输出文件来确定执行文件的正确顺序

    tsc --out app.js app.ts

    然后你只需要 source app.js

  2. 手动指定正确的顺序。对我来说,以下是唯一有效且不会引发错误的顺序。

    <html>
        <head>
            <script src="Things.js"></script>
            <script src="bmw/BMW.js"></script>
            <script src="app.js"></script>
        </head>
        <body>
        </body>
    </html>
    
于 2012-10-13T15:13:46.967 回答
0

你的代码很好。

我的猜测是您没有正确地将脚本标签放置在您的 head 元素中(错误的顺序,或省略了一些)。

解决这个问题并且不必记住正确的声明顺序的最简单方法是通过设置 --out 选项使用来自 tsc 编译器的单个 .js 输出文件。

编辑:根据您正在处理的 js 场景(WSH、Web 应用程序或其他一些 js 环境),您需要以不同的方式链接 js 源文件。以 wsh 为例,您可以使用 FileSystemObject 读取源文件,然后对其进行评估。或者你可以使用 AMD ......

于 2012-10-13T13:55:30.790 回答