En Javascript podría crear una clase como la siguiente, lo que significa que no necesitaría declarar e iniciar una propiedad llamada logs fuera del constructor:
class Logger { constructor() { this.logs = []; } } Sin embargo, en mecanografiado me daría un error: Property 'logs' does not exist on type 'Logger'.ts(2339) Para arreglarlo, declaré una propiedad logs como esta: logs: Array<any>; El pseudocódigo en Typescript sin errores se ve así:
class Logger { logs: Array<any>; constructor() { this.logs = []; } }Esta es probablemente una pregunta de principiantes de TypeScript. Sin embargo, busqué en los documentos y otros recursos y no pude encontrar una explicación. Como sé cómo solucionarlo, estoy más interesado en la explicación, las diferencias y las mejores prácticas.
El "por qué" es complicado. Hay dos partes en esta pregunta.
1. ¿Por qué se necesita una definición de tipo?
VLAZ ya lo ha cubierto en su comentario. TypeScript no tiene suficiente para inferir el tipo, por lo que necesita una guía más explícita.
"¡Seguramente TS puede darse cuenta de que es una matriz!", Eso es cierto, sin embargo...
2. ¿Por qué se necesita la definición de tipo en la parte superior?
El constructor en este caso confunde las cosas, pero tomemos una clase ligeramente diferente:
class Logger { a() { this.logs = 1234; } b() { this.logs = ['a', 'b'] } } De lo anterior, ¿qué tipo son los logs ? depende verdad? Si a() se llama primero, entonces es un número; de lo contrario, es una matriz. "depende" no es lo suficientemente bueno para darnos una fuerte confianza en nuestros tipos. Entonces (creo) Typescript lo obliga a declararlo en un lugar central: la parte superior de la clase, fuera de cualquier método.
También puede preguntar por qué no se puede inferir del constructor. Eso siempre vendría antes a() o b() .
Sospecho que está relacionado con el hecho de que los campos se pueden configurar durante su declaración, como:
class Logger { logs: Array<string> = ['a', 'b']; constructor() { this.logs = 6611; // <-- wait a second... } }