Quería pasar a TypeScript desde JS tradicional porque me gusta la sintaxis tipo C #. Mi problema es que no puedo descubrir cómo declarar clases estáticas en TypeScript.
En C #, a menudo uso clases estáticas para organizar variables y métodos, reuniéndolos en una clase con nombre, sin necesidad de instalar un objeto. En vanilla JS, solía hacer esto con un simple objeto JS:
var myStaticClass = {
property: 10,
method: function(){}
}
En TypeScript, preferiría mi enfoque C-sharpy, pero parece que las clases estáticas no existen en TS. ¿Cuál es la solución adecuada para este problema?
fuente
.js
en suhtml
. EntoncesAngular 2
, probablemente esté usandoSystem
... también lo haríaSystem.import("Folder/M");
(o lo que sea la ruta al.js
archivo compilado ) antes delbootstrap import
Las clases abstractas han sido ciudadanos de primera clase de TypeScript desde TypeScript 1.6. No se puede crear una instancia de una clase abstracta.
Aquí hay un ejemplo:
fuente
Singleton
es para el patrón de memoria compartida de la misma instancia de clase. Además, una clase estática no tiene instancia por definición, por lo que debe lanzar una excepción si el cliente intenta inicializarla.abstract
palabra clave es compatible con TypeScript.abstract
! @KimchiMan - ¡gran idea!La definición de propiedades estáticas y métodos de una clase se describe en 8.2.1 de la Especificación del lenguaje mecanografiado :
donde
Point.distance()
es un método estático (o "clase").fuente
Esta pregunta está bastante anticuada, pero quería dejar una respuesta que aproveche la versión actual del idioma. Desafortunadamente, las clases estáticas aún no existen en TypeScript, sin embargo, puede escribir una clase que se comporte de manera similar con solo una pequeña sobrecarga utilizando un constructor privado que evite la creación de instancias de clases desde el exterior.
Este fragmento le permitirá usar clases "estáticas" similares a la contraparte de C # con el único inconveniente de que aún es posible crear instancias desde adentro. Afortunadamente, no puedes extender clases con constructores privados.
fuente
Esta es una forma:
__static_ctor
Aquí hay una expresión de función invocada inmediatamente. El mecanografiado generará código para llamarlo al final de la clase generada.Actualización: Para los tipos genéricos en constructores estáticos, a los que los miembros estáticos ya no pueden hacer referencia, ahora necesitará un paso adicional:
En cualquier caso, por supuesto, puede llamar al constructor estático de tipo genérico después de la clase, como:
Sólo recuerde utilizar NUNCA
this
en el__static_ctor
anterior (obviamente).fuente
class SomeClass {}
genera un constructor, apenas vale la pena comentarlo como si se introdujera un nuevo problema. ;) FYI: No hay "constructores" reales en JS, solo funciones que tienen un "esto" cuando se invoca en objetos, o víanew
. Esto existe sin importar qué para cualquier "clase".Obtuve el mismo caso de uso hoy (31/07/2018) y encontré que esto es una solución alternativa. Se basa en mi investigación y funcionó para mí. Expectativa : lograr lo siguiente en TypeScript:
Hice esto:
Por lo tanto, lo consumiremos de la siguiente manera:
Esto funcionó para mí. Si alguien tiene otras mejores sugerencias, ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Si En quien más te guste la ayuda! Gracias...
fuente
Las clases estáticas en lenguajes como C # existen porque no hay otras construcciones de nivel superior para agrupar datos y funciones. Sin embargo, en JavaScript lo hacen, por lo que es mucho más natural declarar un objeto como lo hizo. Para imitar más de cerca la sintaxis de la clase, puede declarar métodos como este:
fuente
Ver http://www.basarat.com/2013/04/typescript-static-constructors-for.html
Esta es una manera de 'falsificar' un constructor estático. No está exento de peligros: consulte el elemento codeplex referenciado .
fuente
Una posible forma de lograr esto es tener instancias estáticas de una clase dentro de otra clase. Por ejemplo:
Luego, se puede acceder a los parámetros utilizando Wrapper, sin tener que declarar una instancia del mismo. Por ejemplo:
Por lo tanto, obtiene los beneficios del objeto de tipo JavaScript (como se describe en la pregunta original) pero con los beneficios de poder agregar la escritura TypeScript. Además, evita tener que agregar 'estática' delante de todos los parámetros de la clase.
fuente
Con los módulos externos ES6 esto se puede lograr así:
Esto evita el uso de módulos internos y espacios de nombres que TSLint [1] [2] considera una mala práctica , permite el alcance privado y público y evita la inicialización de objetos de clase no deseados.
fuente
Estaba buscando algo similar y me encontré con algo llamado
Singleton Pattern
.Referencia: Patrón Singleton
fuente
También puede usar palabras clave
namespace
para organizar sus variables, clases, métodos, etc. Ver doc.fuente