【问题标题】:How to declare a Static Variable inside a function in Typescript?如何在 Typescript 的函数中声明静态变量?
【发布时间】:2020-08-28 06:29:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    【讨论】:

    • 我想投诉这个。它不鼓励糟糕的设计吗?特别是对于鼠标处理,我需要在鼠标按下期间设置某些标志,然后在鼠标移动中查看。当然,这些应该仅限于方法——而不是组件。
    • 目前还不清楚如何降低方法级静态变量的级别。它不能在闭包上,因为方法闭包在类实例之间共享,并且它不能在类实例上,因为没有办法计算一个不知道会被派生类踩到的“安全”名称(甚至基类)。
    • 如下@Trass3r 所示,覆盖每个实例上的函数可能是明智地实现此功能的解决方案。我对 basarat 答案的评论指出,为什么每个实例的静态也会有用,但不确定如何命名它们。
    【解决方案2】:

    有没有办法直接在函数内部声明一个静态局部变量像这样

    它没有特殊的语法。但是,如果您想要一个 有状态函数,这里将介绍该模式:https://github.com/basarat/typescript-book/blob/master/docs/tips/statefulFunctions.md

    你的例子:

    class SomeClass {
        fooBar = (new class {
            foo = 1;
            inc = () => this.foo++;
        }).inc
    }
    
    let foo = new SomeClass();
    console.log(foo.fooBar()); // 1
    console.log(foo.fooBar()); // 2
    

    【讨论】:

    • Basarat, @Ryan-Cavanaugh 但为什么不可能呢?这是因为逻辑限制还是作者出于某种原因没有实现?
    • @A.Singh 因为 TypeScript 并不完美。但它仍然非常棒:medium.com/@basarat/… 所有语言功能都从 -100 开始
    • 请参阅下面@realh 的回答,了解上述错误的原因。
    • +1 - 尽管讨论了静态,但它是一个有用的功能。实际上应该有两个:在类的所有实例的所有函数调用中都是静态的变量,在类的每个实例的所有函数调用中都是“有点静态”的变量。
    【解决方案3】:

    我认为@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() 以满足类型检查;随后的外部定义应该简单地覆盖它。

    【讨论】:

      【解决方案4】:

      改进@realh 的答案,我能够在课堂上解决所有问题:

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多