24

如果我在下面做这样的事情,我怎样才能在课堂上访问该属性?

class Person
{
    private static name: string;
}

console.log(Person.name);

不是应该无法访问吗?

4

3 回答 3

26

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

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

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

于 2012-10-10T20:17:27.293 回答
3
class Person
{
    private static theName: string = "John";
    static get name():string{
        return Person.theName;
    }
}

console.log(Person.name);

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

于 2015-11-16T20:52:21.237 回答
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;
})();

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

于 2015-05-20T14:38:33.787 回答