¿Existen las constantes estáticas públicas en TypeScript? Tengo una clase que se parece a:
export class Library {
public static BOOK_SHELF_NONE: string = "None";
public static BOOK_SHELF_FULL: string = "Full";
}
En esa clase, puedo hacerlo Library.BOOK_SHELF_NONE
y el tsc no se queja. Pero si trato de usar la biblioteca de clases en otro lugar y trato de hacer lo mismo, no lo reconoce.
typescript
Cristal
fuente
fuente
readonly
para asegurarme de que TypeScript le avisará si alguna vez intentó reasignar esos campos:public static readonly BOOK_SHELF_FULL
Respuestas:
Esto es lo que compila este fragmento de TS (a través de TS Playground ):
Como puede ver, ambas propiedades definidas como
public static
simplemente se adjuntan a la función exportada (como sus propiedades); por lo tanto, deben ser accesibles siempre que acceda correctamente a la función en sí.fuente
Si quisiera algo que se comportara más como un valor constante estático en los navegadores modernos (en el sentido de que no puede ser cambiado por otro código), podría agregar un
get
solo acceso a laLibrary
clase (esto solo funcionará para los navegadores ES5 + y NodeJS) :Si lo ejecuta, verá cómo el intento de establecer la
BOOK_SHELF_NONE
propiedad en un nuevo valor no funciona.2,0
En TypeScript 2.0, puede usar
readonly
para lograr resultados muy similares:La sintaxis es un poco más simple y más obvia. Sin embargo, el compilador evita cambios en lugar del tiempo de ejecución (a diferencia del primer ejemplo, donde el cambio no se permitiría en absoluto como se demostró).
fuente
type MyType: Library.BOOK_SHELF_NONE | Library.BOOK_SHELF_FULL;
Puede hacerlo usando espacios de nombres , como este:
Luego puede importarlo desde cualquier otro lugar:
Si necesita una clase allí, inclúyala dentro del espacio de nombres:
export class Book {...}
fuente
{ type: Library.BOOK_SHELF_NONE }
parece pensar que el espacio de nombres no tiene llamada a la exportaciónBOOK_SHELF_NONE
. Sin embargo, si solo establezco una variable local con la referencia, la resuelve bien. TS 2.2Mientras tanto, esto se puede resolver a través de un decorador en combinación con
Object.freeze
oObject.defineProperty
, estoy usando esto, es un poco más bonito que usar toneladas de getters. Puede copiar / pegar este TS Playground directamente para verlo en acción. - hay dos opcionesHacer que los campos individuales sean "finales"
El siguiente decorador convierte los campos anotados estáticos y no estáticos en "propiedades de solo captador".
Nota : Si se anota una variable de instancia sin valor inicial
@final
, el primer valor asignado (sin importar cuándo) será el último.El decorador: ¡asegúrese de incluir esto en su código!
Como alternativa al decorador anterior, también habría una versión estricta de esto, que incluso arrojaría un Error cuando alguien intentara asignar algún valor al campo con el
"use strict";
ajuste. (Sin embargo, esta es solo la parte estática)Haga que cada campo estático sea "final"
Posible inconveniente: Esto solo funcionará para TODAS las estadísticas de esa clase o para ninguna, pero no se puede aplicar a estadísticas específicas.
fuente
if (!value)
debe serif (value === undefined)
dejar que los valores estáticos sean""
o0
.¡Gracias WiredPrairie!
Solo para ampliar un poco su respuesta, aquí hay un ejemplo completo de cómo definir una clase de constantes.
Usar
fuente
La siguiente solución también funciona a partir de TS 1.7.5.
Usar:
fuente
Simplemente 'exportar' variable e 'importar' en su clase
Ahora úsalo como,
fuente
Puede usar un captador para que su propiedad sea de solo lectura. Ejemplo:
Utilizado en otra clase:
fuente
let a = new MyClass(); a.STATUSES.level1 = 'not level1'; let plainWrong = new MyClass().STATUSES.level1; // 'not level1'