Ich habe eine TypeScript-Klassendefinition, die so beginnt.
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];
}
Es sieht so aus, als würde ein Array vom Typ Thing nicht korrekt in den entsprechenden Javascript-Array-Typ übersetzt. Dies ist ein Ausschnitt aus dem generierten JavaScript:
function Person(name) {
this._name = name;
this._possessions = new Entities.Thing[100]();
}
Wenn Sie Code ausführen, der ein Personenobjekt enthält, lösen Sie eine Ausnahme aus, wenn Sie versuchen, das Feld _possession zu initialisieren:
Fehler ist "0x800a138f - Microsoft JScript-Laufzeitfehler: Wert der Eigenschaft '100' kann nicht abgerufen werden: Objekt ist null oder undefiniert".
Wenn ich den Typ von _possession ändere any[]
und _possession mit new Array()
Ausnahme initialisiere, wird dies nicht ausgelöst. Habe ich etwas verpasst?
quelle
private _possessions: Thing[] : [];
in der Klassendefinition tun ?Sie können beides ausprobieren. Sie geben mir keine Fehler.
Es ist auch die vorgeschlagene Methode aus Typoskript für die Array-Deklaration .
Durch die
Array<Thing>
Verwendung von werden die Generika in Typoskript verwendet. Es ist ähnlich wie nach einemList<T>
In-C # -Code zu fragen .oder
quelle
new Array<Thing>(100)
.Die Übersetzung ist korrekt, die Eingabe des Ausdrucks nicht. TypeScript gibt den Ausdruck fälschlicherweise
new Thing[100]
als Array ein. Es sollte ein Fehler seinThing
, eine Konstruktorfunktion mit dem Indexoperator zu indizieren. In C # würde dies ein Array von 100 Elementen zuweisen. In JavaScript ruft dies den Wert am Index 100 auf,Thing
als wäre es ein Konstruktor. Da dieser Wert istundefined
, wird der von Ihnen erwähnte Fehler ausgelöst. In JavaScript und TypeScript möchten Sienew Array(100)
stattdessen.Sie sollten dies als Fehler in CodePlex melden.
quelle