3

TypeScript では、コンパイラがプロトタイプに関数を追加しないと、クラスで関数を宣言できないようです。例えば:

class MyTypeScriptClass {
    // method, is added to prototype
    foo1(): void {
        alert('invoked foo1');
    }

    // private method also added to prototype
    private foo2(): void {
        alert('invoked foo2');
    }

    //// can I have a local function, without making it a private method?
    //function foo3() {
    //    alert('invoked foo3');
    //}
}

上記はこれにコンパイルされます:

var MyTypeScriptClass = (function () {
    function MyTypeScriptClass() { }
    MyTypeScriptClass.prototype.foo1 = function () {
        alert('invoked foo1');
    };
    MyTypeScriptClass.prototype.foo2 = function () {
        alert('invoked foo2');
    };
    return MyTypeScriptClass;
})();

私が探しているのは、次の JavaScript にコンパイルできる typescript です。

var fvm = new FlasherViewModel2();
    var MyTypeScriptClass = (function () {
        function MyTypeScriptClass() { }
        MyTypeScriptClass.prototype.foo1 = function () {
            alert('invoked foo1');
        };
        MyTypeScriptClass.prototype.foo2 = function () {
            alert('invoked foo2');
        };
        function foo3() {
            alert('invoked foo3');
        }
        return MyTypeScriptClass;
    })();

それはできますか?

(補足として、foo3 は外部コードから呼び出せないことを知っています。たとえば、関数を jQuery fadeOut に渡すために、実際にはクラス内の別のメソッドから foo3 を呼び出します。)

4

2 に答える 2

7

apsillersが言及しているように、private staticおそらくあなたが望むものです。現在のビルドではサポートされていませんがprivate static、将来のある時点でTypeScriptにメンバーを含めることができるようになります(設計チームは、これと同様のフィードバックに基づいて、これについて考えを変えました)。

于 2012-12-05T21:05:22.077 に答える
2

タイプスクリプト クラスでプライベート メソッドを使用する別の方法を発見しましたが、そのパターンは少し変な匂いがするかもしれません。私が知る限り、クラスを でラップする場合にのみこれを行うことができますmodule。例えば:

module MyApp {
    // not accessible externally, `this` must be passed in if needed
    function foo3(that: MyTypeScriptClass): void {
        that.foo1();
        alert('invoked foo3');
    }

    // not accessible externally
    function foo4(): void {
        alert('invoked foo4');
    }

    export class MyTypeScriptClass {
        // normal method, is added to prototype
        foo1(): void {
            alert('invoked foo1');
        }

        // private method also added to prototype, is accessible externally
        private foo2(): void {
            alert('invoked foo2');
            foo3(this);
            foo4();
        }
    }
}

上記は次のようにコンパイルされます。

var MyApp;
(function (MyApp) {
    function foo3(that) {
        that.foo1();
        alert('invoked foo3');
    }
    function foo4() {
        alert('invoked foo4');
    }
    var MyTypeScriptClass = (function () {
        function MyTypeScriptClass() { }
        MyTypeScriptClass.prototype.foo1 = function () {
            alert('invoked foo1');
        };
        MyTypeScriptClass.prototype.foo2 = function () {
            alert('invoked foo2');
            foo3(this);
            foo4();
        };
        return MyTypeScriptClass;
    })();
    MyApp.MyTypeScriptClass = MyTypeScriptClass;    
})(MyApp || (MyApp = {}));

foo2()上記の場合、外部 JavaScript はのインスタンスで呼び出すことができますが、実行時に外部からアクセスすることもできMyTypeScriptClassません。最大の注意点は、プライベート メソッドがインスタンスのメンバーにアクセスする必要がある場合は、関数パラメーターとして渡す必要があることです。基本的に、これらはプライベートな静的メソッドです。foo3()foo4()this

var instance = new MyApp.MyTypeScriptClass();

// public, accessible externally
instance.foo1();

// will not compile in a .ts file, but works at runtime from manual js file
instance.foo2();

// runtime exception, foo3 is not defined
foo3(instance);
MyApp.foo3(instance);

// runtime exception, foo4 is not defined
foo4();
MyApp.foo4();

このアプローチは、スカラー変数でも機能しますが、変数も本質的に静的です。異なるクラス インスタンスに対して異なる値を持つことはできません。そのためには、私が知る限り、クラス内でそれらを宣言する必要があります。それらをマークするprivateと、typescript コンパイラがそれらへの外部呼び出しを許可しなくなりますが、他の JavaScript コードは引き続きそれらに外部からアクセスできます。

于 2012-12-07T22:09:43.020 に答える