Elementvariablen, die als readonly
deklariert sind, können mit ihrer Deklaration oder vom Konstruktor zugewiesen werden. Es gibt eine gewisse C# Vertrautheit mit diesem.
Beispiel 1
direkt Hier wird die Nur-Lese-Membervariable zugeordnet, die, wenn Sie nützlich ist, was ein Wert ist, und dass es nie ändern wird.
class Foo {
public readonly bar: number = 123;
}
Beispiel 2
Hier wird die Nur-Lese-Membervariable deklariert, und dann aus dem Konstruktor zugewiesen, die, wenn Sie den Endwert noch nicht wissen, ist nützlich, aber einige Konstruktor Logik lösche das für dich.
class Foo {
public readonly bar: number;
constructor(bar: number) {
this.bar = 123 * bar/100;
}
}
Beispiel 3
Hier ist der Nur-Lese-Membervariable verwendet Kurz Hand Membervariable Erklärung Typoskript, wo globale Elementvariablen aus dem Konstruktor zugeordnet werden, was nützlich ist, wenn der Benutzer eingeben möchten ein Wert, der sich dann nie ändert. In diesem speziellen Beispiel kann bar
entweder vom Benutzer festgelegt werden oder standardmäßig 123
.
class Foo {
constructor(public readonly: bar: number = 123) {
}
}
Beispiel 4
Dies ist etwas, was Sie nicht tun wollen, weil das emittierte JavaScript zwei Aufgaben auf die gleiche Variable verursacht. Ich füge das nur hinzu, damit zukünftige Entwickler wissen, dass sie das wahrscheinlich nicht tun sollten.
class Foo {
public readonly bar: number = 123;
constructor(bar: number) {
this.bar = bar;
}
}
Das emittierte JavaScript wird in etwa so aussehen ...
var Foo = (function() {
function Foo(bar) {
this.bar = 123; // :)
this.bar = bar; // :(
}
return Foo;
})();
Was Unveränderlichkeit?
readonly
wird nur von TypeScript und seinem Compiler unterstützt; Es gibt keine readonly in JavaScript (naja, das ist nicht ganz richtig, nur dass TypeScript nicht wirklich readonly Werte ausgibt). Es gibt ein paar Abhilfen für dieses (und ja, es wäre schön, wenn Typoskript diese für uns emittieren könnte!)
Erstellen eines unveränderlichen Membervariable
class Foo {
// TypeScript respects "readonly"
public readonly bar: number;
constructor(bar: number) {
// JavaScript respects property that isn't writable.
Object.defineProperty(this, "bar", {
value: bar,
enumerable: true,
configurable: false,
writable: false
});
}
}
eine unveränderliche Klasse erstellen
class Foo {
constructor(public readonly bar: number) {
// Nothing in the object is allowed to be reassigned.
Object.freeze(this);
}
}
Sobald Sie den Wert festgelegt haben, können Sie keinen anderen Wert neu zuweisen. –
Aber ich kann es zuweisen. Ich bin mir nicht sicher, warum ich es so machen darf. –
Sorry, ich habe diesen Teil verpasst .. Ich dachte, du schreibst es nicht. –