TypeScript型付き配列の使用法


96

このように始まる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()スローされません。私は何か見落としてますか?

回答:


120

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

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

2
長さは固定されませんが、配列を事前に割り当てる必要があります
Sebastian

なぜprivate _possessions: Thing[] : []; クラス定義でできないのですか?
SuperUberDuper

54

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

これは、配列宣言用のtypescriptからの推奨メソッドでもあります。

それを使用するArray<Thing>ことで、typescriptのジェネリックを利用しています。これはList<T>、c#コードでa を要求するのに似ています。

// 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 = [];
}

3
サイズを事前に割り当てるには、を使用しますnew Array<Thing>(100)
Doug Domeny

1
次のものも使用できます... <Thing> []
danday74

@ danday74-私はあなたの方法を含めるように更新しました、それはts-lint推奨/最新の設定を使用するときのデフォルトです。
キーラン2017年

9

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

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


1
新しいArray(100)は必要ありません。型指定されたものの配列が必要です。これがバグなのか、ドキュメントの仕様の誤解なのかはわかりません。
クラウスNji
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.