J'ai une définition de classe TypeScript qui commence comme ceci;
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];
}
On dirait qu'un tableau de type Thing n'est pas traduit correctement en type de tableau Javascript correspondant. Voici un extrait du code JavaScript généré:
function Person(name) {
this._name = name;
this._possessions = new Entities.Thing[100]();
}
Exécution de code contenant un objet Person, lève une exception lors de la tentative d'initialisation du champ _possession:
L'erreur est «0x800a138f - Erreur d'exécution Microsoft JScript: impossible d'obtenir la valeur de la propriété« 100 »: l'objet est nul ou non défini».
Si je change le type de _possession any[]
et initialise _possession avec une new Array()
exception, il n'est pas lancé. Ai-je oublié quelque chose?
la source
private _possessions: Thing[] : [];
dans la définition de classe?Vous pouvez essayer l'un ou l'autre. Ils ne me donnent pas d'erreurs.
C'est également la méthode suggérée par le typographie pour la déclaration de tableau .
En utilisant le,
Array<Thing>
il utilise les génériques en tapuscrit. Cela revient à demander unList<T>
code en c #.ou
la source
new Array<Thing>(100)
.La traduction est correcte, le typage de l'expression ne l'est pas. TypeScript ne saisit pas correctement l'expression
new Thing[100]
sous forme de tableau. Cela devrait être une erreur d'indexationThing
, une fonction constructeur, utilisant l'opérateur d'index. En C #, cela allouerait un tableau de 100 éléments. En JavaScript, cela appelle la valeur à l'index 100 deThing
comme si était un constructeur. Puisque ces valeurs sont,undefined
elles soulèvent l'erreur que vous avez mentionnée. Dans JavaScript et TypeScript, vous voulez à lanew Array(100)
place.Vous devriez signaler cela comme un bogue sur CodePlex.
la source