TypeScript中的私有静态属性

时间:2012-10-10 20:11:17

标签: typescript

如果我在下面做了类似的事情,我该如何在课堂上访问该物业?

class Person
{
    private static name: string;
}

console.log(Person.name);

不应该无法进入吗?

3 个答案:

答案 0 :(得分:15)

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

  

无法指定静态的可访问性 - 它们实际上总是公开的。

关于静力学的辅助功能修饰符是团队过去考虑过的事情。如果你有一个强大的用例,你应该在codeplex网站上提出这个问题!

答案 1 :(得分:1)

嗯,不是真的,事实上你可以。也许最重要的是询问它所涉及的TypeScript 版本。我有 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;
})();

并且编译它(这是你看到的)以及执行它都没有问题(你应该相信,或者,如果你愿意的话,试试)。

答案 2 :(得分:0)

class Person
{
    private static theName: string = "John";
    static get name():string{
        return Person.theName;
    }
}

console.log(Person.name);

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