arrays - tipografia - Tipo de letra TypingScript uso
tipografia html (3)
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 de tipo 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]();
}
Ejecutando código que contiene un objeto Person, lanza una excepción cuando intentas 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 indefinido".
Si cambio el tipo de _possession a any[]
e inicializo _possession con la new Array()
excepción new Array()
no se lanza. ¿Me he perdido algo?
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 undefined
están undefined
, plantea el error que mencionaste. En JavaScript y TypeScript, quiere una new Array(100)
lugar.
Debe informar esto como un error en CodePlex.
Podrías probar cualquiera de estos. No me están dando errores.
También es el método sugerido de mecanografiado para declaración de matriz .
Al usar el Array<Thing>
está haciendo uso de los genéricos en mecanografiado. Es similar a pedir una 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 = [];
}
Usted tiene un error en su sintaxis aquí:
this._possessions = new Thing[100]();
Esto no crea una "variedad de cosas". Para crear una matriz de cosas, simplemente puede usar la expresión literal de la matriz:
this._possessions = [];
Del constructor de la matriz si quieres establecer la longitud:
this._possessions = new Array(100);
He creado un breve ejemplo de trabajo que puedes 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();
}
}
}