¿Declarar constantes estáticas en clases de ES6?
Quiero implementar constantes en a class
, porque ahí es donde tiene sentido ubicarlas en el código.
Hasta ahora, he estado implementando la siguiente solución con métodos estáticos:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
Sé que existe la posibilidad de jugar con prototipos, pero muchos lo desaconsejan.
¿Existe una mejor manera de implementar constantes en las clases de ES6?
Aquí hay algunas cosas que podrías hacer:
Exportar a const
desde el módulo . Dependiendo de su caso de uso, podría simplemente:
export const constant1 = 33;
E impórtelo desde el módulo cuando sea necesario. O, basándose en su idea de método estático, podría declarar un static
descriptor de acceso get :
const constant1 = 33,
constant2 = 2;
class Example {
static get constant1() {
return constant1;
}
static get constant2() {
return constant2;
}
}
De esa manera, no necesitarás paréntesis:
const one = Example.constant1;
Ejemplo de REPL de Babel
Luego, como usted dice, dado que a class
es solo azúcar sintáctico para una función, puede agregar una propiedad que no se puede escribir de esta manera:
class Example {
}
Object.defineProperty(Example, 'constant1', {
value: 33,
writable : false,
enumerable : true,
configurable : false
});
Example.constant1; // 33
Example.constant1 = 15; // TypeError
Sería bueno si pudiéramos hacer algo como:
class Example {
static const constant1 = 33;
}
Pero desafortunadamente esta sintaxis de propiedad de clase solo está en una propuesta de ES7, e incluso así no permitirá agregarla const
a la propiedad.
class Whatever {
static get MyConst() { return 10; }
}
let a = Whatever.MyConst;
Parece funcionar para mi.
Estoy usando babel
y la siguiente sintaxis me funciona:
class MyClass {
static constant1 = 33;
static constant2 = {
case1: 1,
case2: 2,
};
// ...
}
MyClass.constant1 === 33
MyClass.constant2.case1 === 1
Por favor considere que necesita el preset "stage-0"
.
Para instalarlo:
npm install --save-dev babel-preset-stage-0
// in .babelrc
{
"presets": ["stage-0"]
}
Actualización para el escenario:
se avanzó stage-3
.
Actualización Babel 7:
Según Babel 7, los ajustes preestablecidos de la etapa están en desuso .
El complemento de Babel a utilizar es @babel/plugin-proposal-class-properties
.
npm i --save-dev @babel/plugin-proposal-class-properties
{
"plugins": ["@babel/plugin-proposal-class-properties"]
}
Nota: este complemento está incluido en @babel/preset-env