このように始まる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()
で初期化すると、例外はスローされません。私は何か見落としてますか?
ここの構文にエラーがあります:
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();
}
}
}
これらのいずれかを試すことができます。彼らは私にエラーを与えていません。
配列宣言用の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 = [];
}
翻訳は正しいですが、式の入力は正しくありません。 TypeScriptは、式new Thing[100]
を配列として誤って入力しています。インデックス演算子を使用して、コンストラクタ関数Thing
のインデックスを作成するとエラーになるはずです。 C#では、これは100要素の配列を割り当てます。 JavaScriptでは、これはコンストラクターであるかのようにThing
のインデックス100の値を呼び出します。その値はundefined
であるため、前述のエラーが発生します。 JavaScriptとTypeScriptでは、代わりにnew Array(100)
が必要です。
これをCodePlexのバグとして報告する必要があります。