Utilisation du tableau typé TypeScript

J’ai une définition de classe TypeScript qui commence comme ceci;

module Entities { export class Person { private _name: ssortingng; private _possessions: Thing[]; private _mostPrecious: Thing; constructor (name: ssortingng) { this._name = name; this._possessions = new Thing[100]; } 

On dirait qu’un tableau de type Thing ne se traduit pas 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](); } 

Exécuter du code contenant un object Person, lancez une exception lorsque vous tentez d’initialiser le champ _possession:

Error is “0x800a138f – Erreur d’exécution Microsoft JScript: impossible d’obtenir la valeur de la propriété ‘100’: l’object est nul ou non défini”.

Si je change le type de _possession en any[] et initialise _possession avec une new Array() exception new Array() n’est pas levé. Ai-je manqué 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 du 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 la cour de récréation .

     module Entities { class Thing { } export class Person { private _name: ssortingng; private _possessions: Thing[]; private _mostPrecious: Thing; constructor (name: ssortingng) { 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 de typecript pour la déclaration de tableau .

    En utilisant le Array il utilise les génériques de typecript. Il est similaire à demander une List dans le code c #.

     // Declare with default value private _possessions: Array = new Array(); // or private _possessions: Array = []; // or -> prefered by ts-lint private _possessions: Thing[] = []; 

    ou

     // declare private _possessions: Array; // or -> preferd by ts-lint private _possessions: Thing[]; constructor(){ //assign this._possessions = new Array(); //or this._possessions = []; } 

    La traduction est correcte, la saisie de l’expression n’est pas. TypeScript ne saisit pas correctement l’expression new Thing[100] tant que tableau. Cela devrait être une erreur d’indexer Thing , une fonction constructeur, en 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 de Thing comme s’il s’agissait d’un constructeur. Puisque ces valeurs ne sont undefined cela soulève l’erreur que vous avez mentionnée. Dans JavaScript et TypeScript, vous voulez un new Array(100) place.

    Vous devriez signaler cela comme un bogue sur CodePlex.