如何在Typescript中的函数内声明静态变量?

时间:2016-01-28 05:25:51

标签: typescript

我知道我们可以在类中声明静态变量或函数 像这样

class SomeClass(){
  static foo = 1;
  static fooBar(){ 
    return ++SomeClass.foo;
  }
}

有没有办法在函数内部直接声明静态局部变量?

class SomeClass(){
  fooBar(){
    static foo = 1;
    return ++this.foo;
  }
}

4 个答案:

答案 0 :(得分:9)

这是不可能的。您可以在类中声明静态,但不能在函数体中声明。

答案 1 :(得分:5)

  

有没有办法直接在函数内声明静态局部变量

没有特殊的语法。但是如果你想要一个有状态函数,这里可以看到这个模式:https://github.com/basarat/typescript-book/blob/master/docs/tips/statefulFunctions.md

对于你的例子:

echo $this->Html->link('View Page', array(
    'controller' => 'page',
    'action' => 'view',
    '?' => array('Search.brand_id' => 1, 'Search.shop_id' => 1))
);

答案 2 :(得分:1)

我认为@basarat的答案有问题。添加此内容:

let bar = new SomeClass();
console.log(bar.fooBar());

结果为1,因为fooBar不是方法,而是一个恰好是函数的字段。因此,SomeClass的每个实例都有自己的fooBar闭包,并有自己独特的foo

我认为要像在C ++中那样真正模拟静态局部变量,答案应该是3,因为所有实例都共享一个方法和一个foo。要在Typescript中执行此操作,您可以在类的其余部分后之后定义fooBar

SomeClass.prototype.fooBar = (function() {
    let foo = 1;
    function fooBar() {
        return foo++;
    }
    return fooBar;
})();

我还使用了不同的习惯用法来创建闭包,从而避免引入新类并且不使用箭头符号。万一fooBar曾经需要访问实例的成员,那么this所指的东西就不会造成任何混乱。

如果有必要,我想您也可以在类主体中包含fooBar()的虚拟定义,以进行类型检查;随后的外部定义应该简单地覆盖它。

答案 3 :(得分:1)

通过改进@realh的答案,我能够在类中解决所有问题:

SomeClass {
...
    fooBar = (function () {
        let foo = 1;
        function fooBar(this: SomeClass) {
            return foo++;
        }
        return fooBar;
    })();

此参数是访问类字段的关键部分。