100

次のように始まる TypeScript クラス定義があります。

module Entities {          

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = new Thing[100];
        }

Thing 型の配列が、対応する Javascript 配列型に正しく変換されないようです。これは、生成された JavaScript のスニペットです。

function Person(name) {
    this._name = name;
    this._possessions = new Entities.Thing[100]();
}

Person オブジェクトを含むコードを実行し、_possession フィールドを初期化しようとすると例外がスローされます。

エラーは「0x800a138f - Microsoft JScript ランタイム エラー: プロパティ '100' の値を取得できません: オブジェクトが null または未定義です」です。

_possession のタイプを変更して _possession をany[] 初期化すると、new Array()例外はスローされません。私は何か見落としてますか?

4

3 に答える 3

122

ここで構文にエラーがあります:

this._possessions = new Thing[100]();

これは「ものの配列」を作成しません。ものの配列を作成するには、単純に配列リテラル式を使用できます。

this._possessions = [];

長さを設定する場合は、配列コンストラクターの次のようにします。

this._possessions = new Array(100);

プレイグラウンドで試すことができる簡単な作業例を作成しました。

module Entities {  

    class Thing {

    }        

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = [];
            this._possessions.push(new Thing())
            this._possessions[100] = new Thing();
        }
    }
}
于 2012-10-13T09:22:20.517 に答える
9

翻訳は正しく、式の入力は正しくありません。TypeScript は、式new Thing[100]を配列として誤って入力しています。Thingindex 演算子を使用してコンストラクタ関数であるindex を実行すると、エラーになるはずです。C# では、これにより 100 個の要素の配列が割り当てられます。JavaScript ではThing、コンストラクターであるかのように、インデックス 100 の値を呼び出します。その値はundefinedあなたが言及したエラーを引き起こします。JavaScript と TypeScriptでは、new Array(100)代わりに必要です。

これは、CodePlex のバグとして報告する必要があります。

于 2012-10-13T07:52:37.080 に答える