2015-10-26 65 views
1

在对象文字中使用getter和setter时,我看不到在Typescript中访问外层“this”范围的简单方法。考虑以下几点:TypeScript:从字面getter访问外层“this”

class Report { 
    stuff: any[]; 

    options = { 
     length: 10, 
     get maxLength() { return REPORT.stuff.length } 
    } 
} 

REPORT想成为的Report对象的实例的引用。我意识到我可以通过在构造函数中设置选项并使用var REPORT = this或类似的方法解决此问题,但似乎不够优雅。有没有办法更干净地做到这一点?

回答

3

我意识到,我可以在构造函数中设置选项,并使用VAR REPORT =这种或类似的解决这个问题,但似乎不雅

相反,你可以利用构造函数设置选项options *正在构造函数中定义的事实。因此,存储thisoptions

class Report { 
    stuff: any[] = []; 

    options = { 
     _report: this, 
     length: 10, 
     get maxLength() { return (this._report as Report).stuff.length } 
    } 
} 

let foo = new Report(); 
foo.stuff = [1,2]; 
console.log(foo.options.maxLength); // 2 
+0

玩了一下后,我也回答了这个问题。在我看来,这仍然不是完美的,但我猜这是目前我们能做的最好的。 –

+0

需要演员阵容。然而'self = this'从测试中遗留下来了......因此现在被删除了,谢谢 – basarat

+0

@JohnnyHK没有演员,它是'任何'和不安全的 – basarat

1

您可以利用lambda表达式的this绑定。

class Report { 
    stuff: any[]; 

    options = { 
     length: 10, 
     maxLength:() => this.stuff.length 
    } 
} 

编译成

var Report = (function() { 
    function Report() { 
     var _this = this; 
     this.options = { 
      length: 10, 
      maxLength: function() { return _this.stuff.length; } 
     }; 
    } 
    return Report; 
})(); 

编辑:这使得代替吸气功能像你原本。我认为这是一个错字,直到现在,当我刚刚了解到这是有效的JavaScript。

+0

不幸的是,这并不在同一个对象结果作为我的榜样。我想maxLength是一个_value property_,在你的例子中,这是一个函数。为了在我的例子中访问该值,你需要在你的''report.options.maxLength''中写入,你需要'report.options.maxLength()' –

+0

@YonaAppletree:今天,我了解到javascript有值属性。我以前没见过他们。我知道胖箭头lambda不能给出名字,所以我没有看到制作这样一个getter的优雅方式。 – recursive

+0

我也刚刚了解了对象文字中的getters/setter。我知道你可以用Object.defineProperty在已经定义的对象上完成它,但我不知道它在文字中是有效的。我猜这就是TypeScript获取其属性方法的语法(或者实际调用的任何语法)的地方。 –