100 votes

Utilisation des tableaux typés TypeScript

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];
        }

Il semble qu'un tableau de type Thing ne soit pas traduit correctement dans le type de tableau Javascript correspondant. Voici un extrait du JavaScript généré :

function Person(name) {
    this._name = name;
    this._possessions = new Entities.Thing[100]();
}

L'exécution de code contenant un objet Personne, lève une exception lors de la tentative d'initialisation du champ _possession :

L'erreur est "0x800a138f - Microsoft JScript runtime error : Unable to get value of the property '100' : object is null or undefined".

Si je change le type de _possession en any[] et initialiser _possession avec new Array() n'est pas déclenchée. Ai-je manqué quelque chose ?

122voto

Steve Fenton Points 55265

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 array :

this._possessions = [];

du constructeur du 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 site Web de la Commission européenne. terrain de jeux .

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();
        }
    }
}

59voto

Kieran Points 4268

Deux options syntaxiques sont disponibles lors de la déclaration d'un tableau en écriture standard. L'option docs sur la typographie utilise Array<T> mais ts-lint préfère T[]

En utilisant le Array<Thing> il utilise les génériques dans le script. C'est similaire à la demande d'un List<T> en code c#.

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

ou

// declare then assign in the constructor
private _possessions: Array<Thing>; // or
private _possessions: Thing[]; // or -> preferd by ts-lint

constructor(){
    this._possessions = new Array<Thing>(); // or
    this._possessions = []; // or
}

9voto

chuckj Points 7975

La traduction est correcte, la typographie de l'expression ne l'est pas. TypeScript tape incorrectement l'expression new Thing[100] comme un tableau. Ce devrait être une erreur d'indexer Thing une fonction constructrice, en utilisant l'opérateur d'indexation. En C#, cela allouerait un tableau de 100 éléments. En JavaScript, cela appelle la valeur à l'indice 100 de la fonction Thing comme s'il s'agissait d'un constructeur. Puisque cette valeur est undefined il soulève l'erreur que vous avez mentionnée. En JavaScript et TypeScript, vous voulez new Array(100) à la place.

Vous devriez signaler ce problème comme un bogue sur CodePlex.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X