TypeScript verwendet eine Getter/Setter-Syntax, die mit ECMAScript4/ActionScript3 vergleichbar ist.
class foo {
private _bar: boolean = false;
get bar(): boolean {
return this._bar;
}
set bar(value: boolean) {
this._bar = value;
}
}
Um es jedoch überhaupt verwenden zu können, müssen Sie sicherstellen, dass der TypeScript-Compiler ECMAScript5 oder höher unterstützt. Wenn Sie den Befehlszeilen-Compiler verwenden, benutzen Sie --target
Flagge wie diese;
tsc --target ES5
Wenn Sie Visual Studio verwenden, müssen Sie Ihre Projektdatei bearbeiten, um das Flag zur Konfiguration für das TypeScriptCompile-Build-Tool hinzuzufügen. Sie können sehen, dass ici :
Das erzeugt dieses JavaScript, das ECMAScript 5 verwendet Object.defineProperty()
Funktion.
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;
})();
Neuere Versionen von EcmaScript erzeugen Code, der dem ursprünglichen TypeScript ähnlicher ist. Wenn Sie zum Beispiel EcmaScript2017 anvisieren, wird der Code erzeugt:
"use strict";
class foo {
constructor() {
this._bar = false;
}
get bar() {
return this._bar;
}
set bar(value) {
this._bar = value;
}
}
Um es zu benutzen,
var myFoo = new foo();
if(myFoo.bar) { // calls the getter
myFoo.bar = false; // calls the setter and passes false
}
Wie @DanFromGermany weiter unten vorschlägt, sollten Sie einfach eine lokale Eigenschaft lesen und schreiben wie foo.bar = true
dann ist ein Setter- und Getter-Paar ein Overkill. Sie können sie immer später hinzufügen, wenn Sie etwas tun müssen, wie die Protokollierung, wenn 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 Readonly- und optionalen Typen interagieren.
//
// type with optional readonly property.
// baz?:string is the same as baz:string|undefined
//
type Foo = {
readonly bar: string;
readonly baz?: string;
}
const foo:Foo = {bar: "bar"}
console.log(foo.bar) // prints 'bar'
console.log(foo.baz) // prints undefined
//
// interface with optional readonly property
//
interface iFoo {
readonly bar: string;
readonly baz?: string;
}
const ifoo:iFoo = {bar: "bar"}
console.log(ifoo.bar) // prints 'bar'
console.log(ifoo.baz) // prints undefined
//
// class implements bar as a getter,
// but leaves off baz.
//
class iBarClass implements iFoo {
get bar() { return "bar" }
}
const iBarInstance = new iBarClass()
console.log(iBarInstance.bar) // prints 'bar'
console.log(iBarInstance.baz) // prints 'undefined'
// accessing baz gives warning that baz does not exist
// on iBarClass but returns undefined
// note that you could define baz as a getter
// and just return undefined to remove the warning.
//
// class implements optional readonly property as a 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) // prints bar
console.log(iBazInstance.baz) // prints baz