1. ホーム
  2. typescript

[解決済み] TypeScriptのプライベートな「関数

2023-07-15 04:10:33

質問

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で活発に議論されており、例えば はこちら .