typescript - change - meta tags angular 6
¿Última palabra clave en mecanografiado? (3)
¿Hay alguna manera de hacer que una variable esté disponible para ser asignada solo una vez? Me gusta esto
interface IFACE{
a: number;
final b: number;
}
IFACEConstructor (a: number): IFACE {
return {a: a, b: 1}
}
test = IFACEConstructor(2);
test.a = 5 //OK
test.b = 2 //Error
Estará disponible desde la versión 1.4, puede consultar el artículo Anouncing TypeScript 1.4, sección de soporte "Let / Const" :
"TypeScript ahora admite el uso de ''let'' y ''const'' además de ''var''. Actualmente requieren el modo de salida ES6, pero estamos investigando la posibilidad de reducir esta restricción en versiones futuras".
Const debe ser implementado de acuerdo con el article .
Puede obtener TypeScript 1.4 here .
Actualización 1
Por supuesto, "const no es lo mismo que final". La pregunta fue "¿Hay alguna forma de hacer que una variable esté disponible para asignarla solo una vez?". Entonces, de acuerdo con esta documentation :
Las declaraciones const deben tener un inicializador, a menos que en el contexto ambiental
Es un error escribir a una const.
const c = 0;
console.log(c); // OK: 0
c = 2; // Error
c++; // Error
{
const c2 = 0;
var c2 = 0; // not a redeclaration, as the var is hoisted out, but still a write to c2
}
Y, por ahora (noviembre de 2015), "const" me parece la única forma, dada por escritura tipográfica, lista para usar, para realizar la tarea anterior.
Para aquellos que votaron a la baja: si tiene otra respuesta, por favor, compártala en este hilo con la comunidad.
Actualización 2: solo lectura
El modificador de readonly (gracias a @basarat) ha sido introducido en Typescript 2.0. Puede inicializarlos en el punto de declaración o en el constructor.
Incluso puede declarar una propiedad de clase como de solo lectura. Puede inicializarlos en el punto de declaración o en el constructor como se muestra a continuación:
class Foo { readonly bar = 1; // OK readonly baz: string; constructor() { this.baz = "hello"; // OK } }
Pero como dijo @RReverser en este hilo :
Como es habitual en todo lo nuevo, debe utilizar npm i typescript @ next para obtener el compilador más reciente con funciones experimentales incluidas.
No hay una palabra clave final, pero puede usar readonly de las siguientes maneras:
Asignar una vez
class IFACE {
constructor(public a: number, readonly b: number) {}
}
let test: IFACE = new IFACE(1, 34);
test.a = 5; // OK
// test.b = 2; // Error
console.log(test.a, test.b); // 5 34
Deshabilitar anulando
class IFACE {
constructor(public a: number, readonly b: number) {
// console.log(`b is ${this.b}`);
this.b = 2; // b is always 2
// console.log(`b is ${this.b}`);
}
}
let test: IFACE = new IFACE(1, 34);
test.a = 5;
console.log(test.a, test.b); // 5 2
No estoy seguro de si el último es un error al ver que estás asignando dos veces a un campo de solo lectura: una vez en el parámetro constructor y una vez en el cuerpo del constructor.
Tenga en cuenta que puede cambiar el último a este si la asignación doble le molesta tanto como a mí :
class IFACE {
a: number;
readonly b: number = 2;
constructor(a: number) { this.a = a; }
}
Podrías usar set / get para lograr el resultado.
class Test {
constructor(public a: number, private _b: number) {}
get b(): number {
return this._b;
}
}
var test = new Test(2, 1);
test.a = 5 //OK
test.b = 2 //Error
test.b
no se puede configurar porque no tiene un configurador.
El compilador TS no lo advertirá, pero el navegador arrojará un error.