web-dev-qa-db-fra.com

TypeScript typed array utilisation

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?

93
Klaus Nji

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

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 = [];
}
51
Kieran

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.

8
chuckj