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 dans le type de tableau Javascript correspondant. Ceci est un extrait du code JavaScript généré:
function Person(name) {
this._name = name;
this._possessions = new Entities.Thing[100]();
}
En exécutant du code contenant un objet Person, émettez 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 null ou non défini".
Si je change le type de _possession en any[]
et initialise _possession avec new Array()
l'exception n'est pas levée. Ai-je oublié quelque chose?
Vous avez une erreur dans votre syntaxe ici:
this._possessions = new Thing[100]();
Cela ne crée pas un "tableau de choses". Pour créer un tableau de choses, vous pouvez simplement utiliser l'expression littérale de tableau:
this._possessions = [];
Du constructeur de tableau si vous voulez définir la longueur:
this._possessions = new Array(100);
J'ai créé un bref exemple de travail que vous pouvez essayer dans le terrain de je .
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();
}
}
}
Vous pouvez essayer l'un ou l'autre. Ils ne me donnent pas d'erreurs.
C'est aussi la méthode suggérée par TypeScript pour la déclaration de tablea .
En utilisant le Array<Thing>
, il utilise les génériques de TypeScript. Cela revient à demander un List<T>
en code c #.
// Declare with default value
private _possessions: Array<Thing> = new Array<Thing>();
// or
private _possessions: Array<Thing> = [];
// or -> prefered by ts-lint
private _possessions: Thing[] = [];
ou
// declare
private _possessions: Array<Thing>;
// or -> preferd by ts-lint
private _possessions: Thing[];
constructor(){
//assign
this._possessions = new Array<Thing>();
//or
this._possessions = [];
}
La traduction est correcte, la saisie de l'expression ne l’est pas. TypeScript ne saisit pas correctement l'expression new Thing[100]
sous la forme d'un tableau. Il devrait être erroné d'indexer Thing
, une fonction constructeur, à l'aide de l'opérateur d'index. En C #, ceci allouerait un tableau de 100 éléments. En JavaScript, cela appelle la valeur à l’indice 100 de Thing
comme si c’était un constructeur. Puisque cette valeur est undefined
, l'erreur que vous avez mentionnée est soulevée. Dans JavaScript et TypeScript, vous souhaitez plutôt new Array(100)
.
Vous devriez signaler ceci comme un bogue sur CodePlex.