2017-03-21 8 views
0

目指す

は、私は2つのパラメータ取るプライベート機能があります。対応する関数インターフェイスのパラメータを取るインターフェイス上の関数フィールドを作成するにはどうすればよいですか?

export interface XhrHelperFunction extends Function { 
    (cb ?: Function, lock ?: boolean) : any; 
} 

を...と私は、ユーザーがそのプライベート関数を呼び出すことができますパブリック関数のためのインターフェースがあります。

export interface Actionable { 
    run(cb : Function, lock?: boolean) : void; 
} 

この形式の問題は、XhrHelperFunctionのインターフェイスを更新するたびに、対応するように私のActionableインターフェイスのフォーマットを更新する必要があるということです。したがって、私は似た方法でActionableを書き換えることを好むだろう:run(/* Parameters of XhrHelperFunction */) : void;

試み

私は次の形式を試してみた:

export interface Actionable { 
    run(XhrHelperFunction) : void; 
} 

クラス内runメソッドのシグネチャを書くときにこれは動作しますしかし、クラスインスタンスにパラメータを渡すときには機能しません。明らかにパラメータがfunction run(XhrHelperFunction) : voidの署名に準拠していないため、actionable.run(cb, lock)です。括弧で囲んでXhrHelperFunctionにキャストすることもできません。

あなたはどう思いますか?

答えて

1

引数型を導入することができます。

interface IArguments { 
    cb? : Function; 
    lock? : boolean; 
} 

とあなたのインターフェイスは、このタイプによって異なります私は疑問に思って

export interface XhrHelperFunction extends Function { 
    (args : IArguments) : any; 
} 

export interface Actionable { 
    run(arguments : IArguments) : void; 
} 

、あなたは非常に公開するときに、最初の場所でヘルパー関数を公開しない理由パブリックAPIとしての薄いラッパーこれにより、このインタフェースの複雑さが軽減されます。パブリックインターフェイスを解放すると、Actionableインターフェイスに応じてすべての場所を変更する必要があるため、関数のパラメータを変更することがますます面倒になることに注意してください。

ActionableインターフェイスのコンシューマからXhrHelperFunctionの変更を隔離したい場合は、とにかく同じ引数タイプを公開することはできません。そのままコードを残す必要があります。

+0

ちょうど私が探していた、ありがとう。はい、私は直接関数を公開するかどうか議論してきました。主に、Actionableを呼び出す前に予備コードを実行するオプションを与えています(例えば、ロックをトグルするなどいくつかの状態を設定するなど)が、関数自体の中からすべてを処理できました。あなたが提案したようにすることができるかもしれません。 –

関連する問題