提问者:小点点

在TypeScript中获取和设置


我正在尝试为属性创建get和set方法:

private _name: string;

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

设置值的关键字是什么?


共2个答案

匿名用户

TypeScript使用与ActionScript3类似的getter/setter语法。

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

这将使用ECMAScript5object.defineProperty()特性生成此JavaScript。

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;
})();

所以要使用它,

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生成工具的配置中。您可以在这里看到:

正如@DanFromGermany在下面所建议的,如果您只是读取和写入一个本地属性,如foo.bar=true,那么使用setter和getter对是矫枉过正的。如果以后需要执行某些操作(如日志记录),则可以随时在读取或写入属性时添加它们。

匿名用户

Ezward已经提供了一个很好的答案,但我注意到其中一个评论问它是如何使用的。对于像我这样遇到这个问题的人来说,我认为在Typescript网站上有一个关于getters和setters的官方文档的链接会很有用,因为这很好地解释了这个问题,希望在更改时始终保持最新,并展示了示例用法:

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

特别是,对于那些不熟悉它的人,请注意,您没有将“get”一词合并到对getter的调用中(对于setter也是如此):

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

您应该简单地执行以下操作:

var myBar = myFoo.bar;  // correct (get)
myFoo.bar = true;  // correct (set) (false is correct too obviously!)

给定一个类,如:

class foo {
  private _bar:boolean = false;

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

则将调用私有“_bar”属性的“bar”getter。