[解決済み] TypeScriptのプライベートな「関数
質問
TypeScriptのクラス内にプライベートな関数(メソッド)を作成することは可能でしょうか?以下のようなものがあるとします。
Person.ts
TypeScriptファイルです。
class Person {
constructor(public firstName: string, public lastName: string) {
}
public shout(phrase: string) {
alert(phrase);
}
private whisper(phrase: string) {
console.log(phrase);
}
}
これをコンパイルすると、以下のように変換される。
var Person = (function () {
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Person.prototype.shout = function (phrase) {
alert(phrase);
};
Person.prototype.whisper = function (phrase) {
console.log(phrase);
};
return Person;
})();
観測データ
私が期待していたのは
whisper
関数はクロージャの中で宣言され、プロトタイプの上では宣言されないと予想していましたか?基本的にこれは
whisper
関数はコンパイル時に公開されるのでしょうか?
どのように解決するのですか?
TypeScriptのpublic/privateキーワードは、TypeScriptがコードをチェックする際にのみ適用され、JavaScriptの出力には影響を与えません。
によると 言語仕様書 (9-10頁)を参照してください。
プライベートな可視性は設計時の構成要素です。 静的型チェックで強制されますが、実行時の強制を意味するものではありません。 ... TypeScriptは設計時にクラスへの実装のカプセル化を強制する。 TypeScriptは設計時には(プライベートメンバの使用を制限することで)クラス内の実装のカプセル化を強制する。 実行時にはすべてのオブジェクトのプロパティにアクセスできるため、実行時にカプセル化を強制することはできない。 実行時にアクセス可能だからです。JavaScript の将来のバージョンでは の実行時強制を可能にするような private name を提供するかもしれません。 メンバ
これはすでにここで質問され、回答されています。 https://stackoverflow.com/a/12713869/1014822
更新しました。 この古い回答は今でも多くのアクセスを集めています。上記の言語仕様のリンクに加え、public, private, そして (現在は) protected なメンバについては TypeScript の ハンドブック のクラスに関する章で詳しく説明されています。
2018年最新情報 ES Private Fieldsの実装は、TypeScriptのFuture項目となりました。 ロードマップ とはいえ 議論 は、これが現在のソフトプライベートの実装を置き換えるものではなく、並列のハードプライベートオプションになることを示唆しています。
2020 年アップデート
ランタイムプライベート
フィールド
を使用して
#
演算子が TS 3.8 で実装されました。それらがどのように機能するか、また、コンパイル時に
private
キーワードを使ったコンパイル時のフィールドとの違いについて、 StackOverflow に良い議論があります。
ここで
.
プライベート メソッド は TC39 ワーキンググループのステージ 3 に到達しました。この機能は現在、TypeScriptで活発に議論されており、例えば はこちら .
関連
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み] TypeScriptでオブジェクトに動的にプロパティを割り当てるには?
-
[解決済み] ジェネリックスを使用したTypescriptのarrow関数の構文はどのようになっていますか?
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み] tsconfig.jsonのtargetは何のためにあるのですか?
-
[解決済み] クラス内列挙型(TypeScript定義ファイル)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TypeScriptの予約語 "type "とは何ですか?
-
[解決済み] 文字列ユニオンから文字列配列へ
-
[解決済み] TypeScriptのプライベートメンバーにはアクセスできないはずなのに、なぜアクセスできるのですか?
-
[解決済み] 他のプロパティを使用できる TypeScript インターフェース
-
[解決済み] Angular 2 カスタムフォーム入力
-
[解決済み] タイプスクリプトでenumをインデックスキーとして使用するには?
-
[解決済み] Angular2 canActivate() 非同期関数呼び出し
-
[解決済み] typescript の module.exports
-
[解決済み] ...は非モジュールのエンティティに解決され、このコンストラクトを使用してインポートすることはできません」とはどういう意味ですか?
-
[解決済み] Angular2でのenumに基づく選択