以下のようなことをした場合、クラス外のプロパティにアクセスするにはどうすればよいですか?
class Person
{
private static name: string;
}
console.log(Person.name);
アクセスできないのではないですか?
以下のようなことをした場合、クラス外のプロパティにアクセスするにはどうすればよいですか?
class Person
{
private static name: string;
}
console.log(Person.name);
アクセスできないのではないですか?
エラーになるはずですが、そうではありません。仕様から、セクション8.2.1:
静力学のアクセシビリティを指定することはできません—それらは事実上常に公開されています。
統計のアクセシビリティ修飾子は、チームが過去に検討したものです。強力なユースケースがある場合は、codeplexサイトでこれを提示する必要があります。
class Person
{
private static theName: string = "John";
static get name():string{
return Person.theName;
}
}
console.log(Person.name);
静的プロパティがプライベートの場合、それにアクセスするための静的getメソッドを提供する必要があります。これは一般的な解決策ではないかもしれませんが、プライベート静的プロパティに直接アクセスするために私が知っている唯一の方法です。一方、インスタンス化されたオブジェクトからプロパティにアクセスする場合も、2番目のgetメソッドを追加する必要があります。静的getメソッドはインスタンス化されたオブジェクトからは見えないため、両方のgetメソッドに同じ名前を付けることができます。
まあ、実際にはそうではありませんが、実際には可能です。おそらく最も重要なのは、関連するTypeScriptのバージョンについて質問することです。VS2012インストールの一部であるv1.5ベータ版を使用しています(はい、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);
};
}
private
上記のサンプルでは、との両方を見ることができますstatic
。クラスは次の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;
})();
そして、それをコンパイルすること(これはあなたが見る)とそれを実行すること(これはあなたが信頼するべきであるか、あなたが望むなら試してみてください)のどちらにも問題はありません。