2012-10-13 307 views
88

Tengo una definición de clase de TypeScript que comienza así;Uso de la matriz con tipo de TypeScript

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

Parece que una matriz de tipo Thing no se traduce correctamente al tipo de matriz Javascript correspondiente. Este es un fragmento del JavaScript generado:

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

ejecución de código que contiene un objeto de persona, una excepción al intentar inicializar el campo _possession:

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

Si cambio del tipo de _possession a any[] e inicializa _possession con la excepción new Array() no se lanza. ¿Me he perdido algo?

Respuesta

104

Usted tiene un error en su sintaxis aquí:

this._possessions = new Thing[100](); 

Esto no crea una "serie de cosas". Para crear un conjunto de cosas, sólo tiene que utilizar la matriz expresión literal:

this._possessions = []; 

del constructor array si desea ajustar la longitud:

this._possessions = new Array(100); 

He creado un breve ejemplo de trabajo se puede probar en el playground.

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

no arregla la longitud, sino que debe preasignar la matriz – Sebastian

+0

por qué no puede hacer 'poses privadas _: cosa []: []; 'en la definición de clase? – SuperUberDuper

8

La traducción es correcta, el tipeo de la expresión no lo es. TypeScript escribe incorrectamente la expresión new Thing[100] como una matriz. Debe ser un error indexar Thing, una función de constructor, utilizando el operador de índice. En C# esto asignaría una matriz de 100 elementos. En JavaScript esto llama al valor en el índice 100 de Thing como si fuera un constructor. Como esos valores son undefined, genera el error que mencionaste. En JavaScript y TypeScript, quiere new Array(100) en su lugar.

Debe informar esto como un error en CodePlex.

+1

No quiero new Array (100). Quiero una matriz mecanografiada de Cosa. No sé si esto es un error o simplemente mi interpretación errónea de la especificación del documento. –

44

Puede probar cualquiera de estos. No me están dando errores.

También es el método sugerido de typescript for array declaration.

Al usar el Array<Thing> está haciendo uso de los genéricos en mecanografiado. Es similar a pedir un List<T> en el código 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[] = []; 

o

// declare 
private _possessions: Array<Thing>; 
// or -> preferd by ts-lint 
private _possessions: Thing[]; 

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

Para preasignar el tamaño, use 'new Array (100)'. –

+1

también puedes usar ... [] – danday74

+0

@danday74 - He actualizado para incluir su método, es el predeterminado cuando se usa ts-pelusa recomendada/configuración más reciente. – Kieran

Cuestiones relacionadas