Tengo una definición de clase de TypeScript que comienza así;
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 de Javascript correspondiente. Este es un fragmento del JavaScript generado:
function Person(name) {
this._name = name;
this._possessions = new Entities.Thing[100]();
}
Al ejecutar un código que contiene un objeto Person, lanza una excepción al intentar inicializar el campo _possession:
El error es "0x800a138f - Error de tiempo de ejecución de Microsoft JScript: no se puede obtener el valor de la propiedad '100': el objeto es nulo o no está definido".
Si cambio el tipo de _possession any[]
ay inicializo _possession con new Array()
excepción, no se lanza. ¿Me he perdido algo?
fuente
private _possessions: Thing[] : [];
en la definición de clase?Puedes probar cualquiera de estos. No me están dando errores.
También es el método sugerido de mecanografiado para la declaración de matrices .
Al usarlo
Array<Thing>
, está haciendo uso de los genéricos en mecanografiado. Es similar a pedir unList<T>
código en c #.o
fuente
new Array<Thing>(100)
.La traducción es correcta, el tipo de expresión no lo es. TypeScript está escribiendo incorrectamente la expresión
new Thing[100]
como una matriz. Debería ser un error indexarThing
, una función constructora, usando el operador de índice. En C #, esto asignaría una matriz de 100 elementos. En JavaScript, esto llama al valor en el índice 100Thing
como si fuera un constructor. Dado que ese valor esundefined
, plantea el error que mencionaste. En JavaScript y TypeScript lo que desea esnew Array(100)
.Debería informar esto como un error en CodePlex.
fuente