web-dev-qa-db-ja.com

TypeScript型付き配列の使用

このように始まる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のタイプをany[]に変更し、_possessionをnew Array()で初期化すると、例外はスローされません。私は何か見落としてますか?

93
Klaus Nji

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

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

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

this._possessions = [];

長さを設定する場合の配列コンストラクター:

this._possessions = new Array(100);

playground で試すことができる簡単な作業例を作成しました。

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();
        }
    }
}
116
Fenton

これらのいずれかを試すことができます。彼らは私にエラーを与えていません。

配列宣言用のTypeScript からの推奨メソッドでもあります。

Array<Thing>を使用することにより、TypeScriptのジェネリックが使用されます。これは、C#コードでList<T>を要求することに似ています。

// Declare with default value
private _possessions: Array<Thing> = new Array<Thing>();
// or
private _possessions: Array<Thing> = [];
// or -> prefered by ts-lint
private _possessions: Thing[] = [];

または

// declare
private _possessions: Array<Thing>;
// or -> preferd by ts-lint
private _possessions: Thing[];

constructor(){
    //assign
    this._possessions = new Array<Thing>();
    //or
    this._possessions = [];
}
51
Kieran

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

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

8
chuckj