TypeScript verwendet die Getter/Setter-Syntax, die der ECMAScript4/ActionScript3 ähnelt.
class foo {
private _bar: boolean = false;
get bar(): boolean {
return this._bar;
}
set bar(value: boolean) {
this._bar = value;
}
}
Um sie überhaupt verwenden zu können, müssen Sie sicherstellen, dass der TypeScript-Compiler auf ECMAScript5 oder höher abzielt. Wenn Sie den Befehlszeilencompiler ausführen, verwenden Sie die --target
-Flag so:
tsc --target ES5
Wenn Sie Visual Studio verwenden, müssen Sie Ihre Projektdatei bearbeiten, um die Flagge zur Konfiguration des TypeScriptCompile-Build-Tools hinzuzufügen. Sie können dies hier sehen:
Dadurch wird dieser JavaScript-Code erzeugt, der das ECMAScript 5-Feature Object.defineProperty()
verwendet.
var foo = (function () {
function foo() {
this._bar = false;
}
Object.defineProperty(foo.prototype, "bar", {
get: function () {
return this._bar;
},
set: function (value) {
this._bar = value;
},
enumerable: true,
configurable: true
});
return foo;
})();
Aktuellere Versionen von EcmaScript erzeugen Code, der mehr wie das Original TypeScript aussieht. Wenn beispielsweise EcmaScript2017 als Ziel festgelegt ist, wird folgendes erzeugt:
"use strict";
class foo {
constructor() {
this._bar = false;
}
get bar() {
return this._bar;
}
set bar(value) {
this._bar = value;
}
}
Um sie zu verwenden,
var myFoo = new foo();
if(myFoo.bar) { // ruft den Getter auf
myFoo.bar = false; // ruft den Setter auf und übergibt false
}
Wie @DanFromGermany unten vorschlägt, wenn Sie einfach eine lokale Eigenschaft wie foo.bar = true
lesen und schreiben, ist ein Setter- und Getter-Paar übertrieben. Sie können sie jederzeit später hinzufügen, wenn Sie etwas machen müssen, z.B. ein Logging, wann die Eigenschaft gelesen oder geschrieben wird.
Getter können verwendet werden, um schreibgeschützte Eigenschaften zu implementieren. Hier ist ein Beispiel, das auch zeigt, wie Getter mit schreibgeschützten und optionalen Typen interagieren.
//
// Typ mit optionaler schreibgeschützter Eigenschaft.
// baz?:string ist das gleiche wie baz:string|undefined
//
type Foo = {
readonly bar: string;
readonly baz?: string;
}
const foo:Foo = {bar: "bar"}
console.log(foo.bar) // gibt 'bar' aus
console.log(foo.baz) // gibt undefined aus
//
// Schnittstelle mit optionaler schreibgeschützter Eigenschaft
//
interface iFoo {
readonly bar: string;
readonly baz?: string;
}
const ifoo:iFoo = {bar: "bar"}
console.log(ifoo.bar) // gibt 'bar' aus
console.log(ifoo.baz) // gibt undefined aus
//
// Klasse implementiert bar als Getter,
// lässt aber baz weg.
//
class iBarClass implements iFoo {
get bar() { return "bar" }
}
const iBarInstance = new iBarClass()
console.log(iBarInstance.bar) // gibt 'bar' aus
console.log(iBarInstance.baz) // gibt 'undefined' aus
// Zugriff auf baz gibt Warnung aus, dass baz nicht auf iBarClass existiert, gibt aber undefined zurück
// beachten Sie, dass Sie baz als Getter definieren könnten
// und einfach undefined zurückgeben, um die Warnung zu entfernen.
//
// Klasse implementiert eine optionale schreibgeschützte Eigenschaft als Getter
//
class iBazClass extends iBarClass {
private readonly _baz?: string
constructor(baz?:string) {
super()
this._baz = baz
}
get baz() { return this._baz; }
}
const iBazInstance = new iBazClass("baz")
console.log(iBazInstance.bar) // gibt bar aus
console.log(iBazInstance.baz) // gibt baz aus
15 Stimmen
Der Unterstrich und PascalCase sind im Konflikt mit den TypeScript-Codierungsrichtlinien: github.com/Microsoft/TypeScript/wiki/Coding-guidelines
4 Stimmen
Hallo @NielsSteenbeek - wenn Sie den TypeScript-Richtlinien für Mitwirkende folgen, würden Sie mit Properties und Backing-Feldern mit einem Namenskonflikt enden. Was ist der vorgeschlagene Ansatz?
1 Stimmen
Vielleicht:
typescript privater name: string; getName() { get: {return this.name;} set: {this.name = ???;} }
12 Stimmen
Es ist gut, dass diese Typescript-Codierungsrichtlinien ziemlich unattraktiv sind. Ich würde sie nur unter Zwang verwenden (z. B. wenn ich dafür bezahlt werde).
40 Stimmen
@NielsSteenbeek: Hast du dieses Dokument gelesen? "Dies ist KEINE verbindliche Richtlinie für die TypeScript-Community"