3

JavaScriptではこれを行うことができます:

function f() {}
f.prop = "property";

TypeScriptでこれが必要ですが、型チェックが必要です。

クラス以外に、関数がプロパティを取得するように強制するためにどのTypeScriptパターンを使用できますか?

インターフェイスを使用できますか?

interface functionWithProperty {
    (): any;
    prop: string;
}

これはTypeScriptの有効なインターフェイスのようですが、TypeScriptコンパイラpropが設定されていることを確認するようにこのインターフェイスを実装するにはどうすればよいですか?

私はこの例を見ました:

var f : functionWithProperty = (() => {
    var _f : any = function () { };
    _f.prop = "blah";
    return _f;
}());

しかし、これは機能しません。削除でき_f.prop = "blah";、すべてがコンパイルされるためです。設定されていることを強制する必要がありpropます。

4

2 に答える 2

3

TypeScript のオブジェクト指向を取り入れて、プロパティと関数を持つクラスを作成する必要があると思います。

例のように関数とプロパティを組み合わせることは有効な JavaScript ですが、TypeScript に飛び込む場合は、それに完全に没頭することもできます。

class MyClass {
    constructor(public myProp: string) {
    }

    myFunc(): string{
        return this.myProp;
    }
}

アップデート

免責事項: この方法はお勧めしません - 前にも述べたように、TypeScript の構造的な機能を使用して、コードを最も読みやすい方法で整理することをお勧めします。

ただし、型宣言を使用する場合は、関数の型を定義できます。

var f: { (): void; prop: string; } = (() => {
    var _f : any = function () { 
        alert(_f.prop);
    };
    _f.prop = "blah";
    return _f;
}());

f();

これにより、 の呼び出し元はfオートコンプリートと型チェックを取得できますが、内容がf準拠していることを確認するためにチェックされることはありません。この段階では「ボンネットの下」にいるため、これを書くことができます...

var f: { (): void; prop: string; } = (() => {
    var _f : any = undefined;
    return _f;
}());

f();

の定義の型チェックfと呼び出しのfチェックを行いたい場合は、クラスを確認する必要があります。

于 2012-10-31T23:26:36.507 に答える
2

宣言のマージ構造型付けを活用することで、完全な型情報でこれをきれいに管理できます。

interface functionWithProperty {
    (): any;
    prop: string;
}


function MyCoolFunc() {
    return "yay";
}

module MyCoolFunc {
    export var prop: string = "wow";
}

// this will compile without errors, MyCoolFunc implements the
// functionWithProperty interface (structurally)
let x: functionWithProperty = MyCoolFunc;

console.log(x.prop, x());
console.log(MyCoolFunc.prop, MyCoolFunc());

// this would result in a compiler error
// let y: functionWithProperty = console.log;

コンパイルされたJavaScriptは、質問で示した例とよく似ていますが、TypeScript コンパイラは何が起こっているかを正確に認識します! 基本的に、 MyCoolFunc のモジュール宣言が関数宣言に追加され、プロパティを持つ関数になります。

MyCoolFunc が functionWithProperty を正しく実装していることをコンパイル時にアサートしたい場合は、上記の例のように、モジュールにエクスポートされていない変数宣言を含めることができます。

于 2015-08-29T21:20:51.170 に答える