获取并设置在TypeScript中

我正在尝试创build一个属性get和set方法:

private _name: string; Name() { get: { return this._name; } set: { this._name = ???; } } 

什么是关键字来设置一个值?

Typescript使用类似于ActionScript3的getter / setter语法。

 class foo { private _bar:boolean = false; get bar():boolean { return this._bar; } set bar(theBar:boolean) { this._bar = theBar; } } 

这将产生这个Javascript,使用Ecmascript 5 Object.defineProperty()function。

 var foo = (function () { function foo() { this._bar = false; } Object.defineProperty(foo.prototype, "bar", { get: function () { return this._bar; }, set: function (theBar) { this._bar = theBar; }, enumerable: true, configurable: true }); return foo; })(); 

所以要使用它,

 var myFoo = new foo(); if(myFoo.bar) { // calls the getter myFoo.bar = false; // calls the setter and passes false } 

但是,为了使用它,您必须确保TypeScript编译器的目标是ECMAScript5。 如果您正在运行命令行编译器,请使用–target标志像这样;

tsc –target ES5

如果您使用Visual Studio,则必须编辑项目文件以将该标志添加到TypeScriptCompile构build工具的configuration中。 你可以在这里看到:

正如@DanFromGermany在下面build议的那样,如果你只是读和写一个像foo.bar = true这样的本地属性,那么拥有setter和getter对是矫枉过正的。 如果您需要执行某些操作(如日志logging),则只要读取或写入属性,就可以随后添加它们。

这是一个应该指向正确方向的工作示例:

 class Foo { _name; get Name() { return Foo._name; } set Name(val) { Foo._name = val; } } 

getter和setter在JavaScript中只是正常的function。 setter是一个函数,它接受一个参数,其值是被设置的值。

Ezward已经提供了一个很好的答案,但是我注意到其中的一个评论问如何使用它。 对于像我这样偶然发现这个问题的人,我认为在Typescript网站上有一个关于getter和setter官方文档的链接是很有用的,因为这样可以很好地解释这个问题,希望能随时更新并显示示例用法:

http://www.typescriptlang.org/docs/handbook/classes.html

特别是对那些不熟悉它的人来说,注意你并没有将“get”这个词join到一个getter的调用中(对于setters来说也是如此):

 var myBar = myFoo.getBar(); // wrong var myBar = myFoo.get('bar'); // wrong 

你应该这样做:

 var myBar = myFoo.bar; // correct (get) myFoo.bar = 'new val'; // correct (set) 

给一个类像:

 class foo { private _bar:boolean = false; get bar():boolean { return this._bar; } set bar(theBar:boolean) { this._bar = theBar; } } 

那么私人“_bar”属性的“bar”getter将被调用。

你可以写这个

 class Human { private firstName : string; private lastName : string; constructor ( public FirstName?:string, public LastName?:string) { } get FirstName() : string { console.log("Get FirstName : ", this.firstName); return this.firstName; } set FirstName(value : string) { console.log("Set FirstName : ", value); this.firstName = value; } get LastName() : string { console.log("Get LastName : ", this.lastName); return this.lastName; } set LastName(value : string) { console.log("Set LastName : ", value); this.lastName = value; } } 

这与创build常用方法非常相似,只需将关键字reserved getset在开头即可。

 class Name{ private _name: string; getMethod(): string{ return this._name; } setMethod(value: string){ this._name = value } get getMethod1(): string{ return this._name; } set setMethod1(value: string){ this._name = value } } class HelloWorld { public static main(){ let test = new Name(); test.setMethod('test.getMethod() --- need ()'); console.log(test.getMethod()); test.setMethod1 = 'test.getMethod1 --- no need (), and used = for set '; console.log(test.getMethod1); } } HelloWorld.main(); 

在这种情况下,你可以跳过返回typesget getMethod1() {

  get getMethod1() { return this._name; } 

我想我可能会明白为什么这么混乱。 在你的例子中,我们需要_name getter和setter。 但是我们通过为一个不相关的类variablesName创buildgetter和setter来达到这个目的。

考虑这个:

 class Car{ private tiresCount = 4; get yourCarTiresCount(){ return this.tiresCount ; } set yourCarTiresCount(count) { alert('You shouldn't change car tire count') } } 

上面的代码如下:

  1. getset创buildgetter和setter为您的yourCarTiresCount不为tiresCount )。

Getter是:

  function() { return this.tiresCount ; } 

和二传手是:

  function(count) { alert('You shouldn't change car tire count'); } 

意思是,每次我们做new Car().yourCarTiresCount ,getter都会运行。 对于每一个new Car().yourCarTiresCount('7') setter运行。

  1. 间接创buildgetter,但不是setter,用于private tireCount