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ファイルとBMWTypeScriptファイルを参照した後、次のコードを実行しようとすると、次のようになります。

var car = new Entities.Cars.BMW("335i", "E90");
car.drive();

「MicrosoftJScriptランタイムエラー:プロパティ'BMW'の値を取得できません:オブジェクトがnullまたは未定義です」というエラーで例外が発生します。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();

この時点で、2つのオプションがあります。

  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>
    
于 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 に答える