TypeScript内部模块用法

时间:2012-10-13 13:39:16

标签: module typescript

我在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出错。我上面的片段有什么问题?

2 个答案:

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

此时您有两个选择:

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

    tsc --out app.js app.ts

    然后您只需要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>
    

答案 1 :(得分:0)

你的代码很好。

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

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

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