【问题标题】:Private static properties in TypeScriptTypeScript 中的私有静态属性
【发布时间】:2018-10-04 21:52:14
【问题描述】:

如果我在下面做这样的事情,我怎样才能访问类之外的属性?

class Person
{
    private static name: string;
}

console.log(Person.name);

不应该是不可访问的吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这应该是一个错误,但不是。从规范,第 8.2.1 节:

    不可能指定静态的可访问性——它们实际上总是公开的。

    静态的可访问性修饰符是团队过去考虑过的。如果你有一个强大的用例,你应该在codeplex 网站上提出这个!

    【讨论】:

    • 当然可以指出私有静态的intent - 也就是说,如果您尝试访问包含类之外的私有静态字段,则会出现编译错误.根据规范:“私有和受保护的可访问性仅在编译时强制执行,并且仅作为意图指示”。
    • @eddie 至少对我来说,意图本身是否令人困惑。我不太确定你为什么要两者兼得。
    【解决方案2】:
    class Person
    {
        private static theName: string = "John";
        static get name():string{
            return Person.theName;
        }
    }
    
    console.log(Person.name);
    

    如果一个静态属性是私有的,我们需要提供一个静态的 get 方法来访问它。这可能不是一个常见的解决方案,但它是我所知道的直接访问私有静态属性的唯一方法。另一方面,如果您还打算从实例化对象访问属性,则可能必须添加第二个 get 方法。两个 get 方法可以具有相同的名称,因为静态 get 方法对于实例化的对象是不可见的。

    【讨论】:

      【解决方案3】:

      嗯,不是真的,事实上你可以。也许最重要的是询问它相关的 TypeScript version。我有 v1.5 beta,这是我安装的 VS2012 的一部分(是的,尽管它是针对 VS2013 的,但它仍然有效)。

      我有这样的课:

      class ItemListPreProcessor {
      
          private static names: string[] = [ 'Name', 'Age' ];
      
          static createHeader = (eltName: string) => {
              var pdiv = $(eltName);
              pdiv.html('<table><thead><tr></tr></thead></tr><tbody></tbody></table>');
              var row = $('tr', pdiv);
              ItemListPreProcessor.names.forEach((n) => {
                  row.append('<th>' + n + '</th>');
              });
              return $('tbody', pdiv);
          };
      }
      

      在上面的示例中,您可以看到privatestatic。该类被编译为以下 JavaScript:

      var ItemListPreProcessor = (function () {
          function ItemListPreProcessor() {
          }
          ItemListPreProcessor.names = ['Name', 'Age'];
      
          ItemListPreProcessor.createHeader = function (eltName) {
              var pdiv = $(eltName);
              pdiv.html('<table><thead><tr></tr></thead></tr><tbody></tbody></table>');
              var row = $('tr', pdiv);
              ItemListPreProcessor.names.forEach(function (n) {
                  row.append('<th>' + n + '</th>');
              });
              return $('tbody', pdiv);
          };
          return ItemListPreProcessor;
      })();
      

      编译它(你看到的)和执行它(你应该相信这个,或者,如果你愿意,试试)都没有问题。

      【讨论】:

      • 它可以编译,但它实际上并不是私有的。这令人沮丧,因为 javascript 本身确实支持此功能。
      • 在 TypeScript 中是私有的,这很重要,就是不能在类外访问静态私有,这是本意。如何将其转换为 Javascript 超出了我对 Brian 的回答范围。而且,准确地说,当我们必须陈述某事时,让我们指定它与哪种语言相关。否则,我们可能会陷入无休止的争论,导致无处可去。
      • 好吧,我不同意它是“重要的”,而且我不确定它是如何“超出”您的答案的,因为您在答案中显示了编译后的 javascript 作为它有效的证据.我只是指出你遗漏了什么。它可能编译没有错误,但实际上它在 javascript 中不是私有的。
      • 那么,你说你关心编译结果? (正确的转译结果。)我没有。这使事情向前发展,我对 C# 或 Java 源代码编译的究竟是什么 CLR 或 JVM 指令不感兴趣,我对 Java/C# 源代码本身感兴趣,当然还有它的执行结果。
      • “执行的结果”是您可能需要多考虑的部分,尤其是当我们在浏览器中讨论 javascript 时。例如,如果您正在编写一个 SDK,并且您希望一个变量是 private static,但实际上消费者不仅可以访问而且可以修改该变量/属性,那么您可能会遇到一些问题,至少可以这么说。
      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多