2017-08-23 11 views
0

私はサードパーティのライブラリを使用していますが、自分のコントロールを登録しようとしていますが、以前は問題ではなかったパラメータとしてコンストラクタを渡す必要がありましたが、コントロールへの別の依存関係であり、パラメータータイプを満たすためのパラメーターとしてクロージャーを渡す方法がわかりません。コンストラクタパラメータとしてクロージャを渡す方法

登録方法は、シグネチャは次の通りです:

class Registrator { 
    static Add(controlName: string, component: new (...params: any[]) => Control): void; 
} 

私は前にコードをfollowinしなければならなかったが、リファクタリングの後、私はそれに依存するいくつかのコードをエクスポートして、私のコントロールをした:

//Old code - working 
Registrator.Add("CountdownTimer", Controls.CountdownTimer); 
//Trying to add Dependency - can't compile 
const countdownTimerFormater = new Objects.Time.TimeFormater(); 
Registrator.Add("CountdownTimer", (...params: any[]) => return new Controls.CountdownTimer(<HTMLElement>(params[0]), countdownTimerFormater)); 

コンパイラエラーがあります: '(... params:any [])=> CountdownTimer'型のパラメータは、 'new(params:any [])=> Control'型のパラメータに対してassagnableではありません。タイプ '(... params:any [])=> CountdownTimer'は署名 'new(... params:any []):Control'に一致しません。

Paramsはコントロールのコンテキストに依存しますが、私の場合は常に1の長さになり、コントロールの親としてサーバになるHTMLElementを渡します。 すべてがjavascriptで機能していることを考慮すると、パラメータを満たすclosureを渡す方法や、私のコードからの依存関係をプルダウンする方法があるように感じます。

+0

コンポーネント:new(... params:any [])=>コントロールをコンポーネント: (... params:any [])=>コントロールに変更しようとしましたか? – cyrix

+0

@cyrix変更できません登録者の署名。追加されていないので追加します私自身。 – CrudaLilium

答えて

0

要求されたパラメータは、newを実行するときにControlクラスを返します。

この(CountdownTimerと仮定するとタイプControlである)のようにそれを実行します。

Registrator.Add("CountdownTimer", class CountdownTimer { 
    private countdownTimerFormater; 

    constructor(element: HTMLElement) { 
     this.countdownTimerFormater = new Objects.Time.TimeFormater(); 
    } 
} 
); 
:あなたはCountdownTimeにcountdownTimerFormaterを作成したい場合、あなたはこのように、クラスをインラインで定義することができます

Registrator.Add("CountdownTimer", Controls.CountdownTimer); 

+0

私はそれを好きでしたが、後で私のコントロールを変更しました。そして、別の依存関係/パラメータが必要になります。そこに依存関係を渡すことができるように記述する方法はありますか? – CrudaLilium

+0

[回答を編集しました] 'new'を実行するコードは、特定のパラメータだけをコンストラクタに渡すようです。他のクラスへのアクセスが必要な場合は、インラインクラス宣言のように、別のクラスを取得する必要があります。 – gilamran

関連する問題