81

TypeScript クラス内にプライベートな「関数」(メソッド) を作成することは可能ですか? 次のPerson.tsTypeScript ファイルがあるとします。

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コンパイル時に関数を公開しますか?

4

3 に答える 3

93

TypeScript の public/private キーワードは、TypeScript がコードをチェックする方法にのみ適用されます。JavaScript の出力には影響しません。

言語仕様によると(pp. 9-10):

プライベートな可視性は設計時の構造です。これは静的型チェック中に適用されますが、ランタイムの適用を意味するものではありません。... TypeScript は、設計時に (プライベート メンバーの使用を制限することにより) クラスの実装のカプセル化を強制しますが、実行時にすべてのオブジェクト プロパティにアクセスできるため、実行時にカプセル化を強制することはできません。JavaScript の将来のバージョンでは、プライベート メンバーの実行時の強制を可能にするプライベート名が提供される可能性があります。

これはすでに質問され、ここで回答されています: https://stackoverflow.com/a/12713869/1014822

更新:この古い回答はまだ大量のトラフィックを取得しているため、上記の言語仕様のリンクに加えて、パブリック、プライベート、および (現在) 保護されているメンバーについては、クラスに関する TypeScriptハンドブックの章で詳しく説明されていることに注意してください。

2018 Update ES プライベート フィールドの実装は TypeScriptロードマップ の将来の項目になりましたが、議論では、これは現在のソフト プライベート実装の代わりではなく、並行するハード プライベート オプションになることが示唆されています。

演算子を使用した2020 Update ランタイム プライベートフィールドは、TS 3.8 で実装されました。それらがどのように機能するか、およびStackOverflow#のキーワードを使用してコンパイル時のフィールドとどのように異なるかについての良い議論がありますhereprivate

プライベートメソッドは、TC39 ワーキング グループのステージ 3 に達しました。この機能は、現在、TypeScript について活発に議論されています (例:ここ) 。

于 2013-06-04T14:01:34.217 に答える
11

Javascript では (TypeScript とは対照的に)、プライベートな「メンバー」関数を持つことはできません。

クロージャーでプライベート関数を定義すると、それをクラスのインスタンスのインスタンス メソッドとして呼び出すことができなくなります。

それが必要な場合は、TypeScript 関数定義をクラス本体の外に移動するだけです。

于 2013-06-04T13:43:24.997 に答える