2017-04-23 11 views
0

私はエラープロパティ '適用' の例として以外のタイプ 'T [K]' 正直に私の主な機能で一般的なことは、関数でなければならないということですか?

const main = <T>(root: T) => <K extends keyof T>(method: K, ...args: any[]) => { 
    root[method].apply(this, ...args); 
}; 

に存在しませんがあります。

const main = <T>(root: T) => <K extends keyof T>(method: K, ...args: any[]) => { 
    (<any>root[method]).apply(this, ...args); 
}; 

UPDATE

私はおそらくそう言っていませんでしたが、私はこの例を意味しました...

UPDATE 2

第LEVEL3及び方法LEVEL4/5との通話(のみ) - works perfectly!

Iは、別の種類(数)のLEVEL6追加する場合 - everything collapses :(

が、それは非常にあります興味深い理由は、最初の呼び出しは、すべての時間のエラー?この場合

、あなたはRUNを行った場合 - すべては結果が 'foo' と 'bar' であるが、コンパイラのtypescriptですが、あなたがこれを行うことができ、エラー

+0

ジェネリック関数がまったく必要ないとは思いません。あなたが探しているものは非常に具体的なようです。私が行方不明のものはありますか? –

+0

以下が得られる。 新しい例では、UPDATE 2 –

+0

構造は非常に限定されています。どんな解決策も一般的にするのは意味がありません。あなたはあまりにも多くの作業を終了し、理解しにくく、必要以上に多くのコードを含み、特定の解決策より悪い結果をもたらす解決策に終わるでしょう。このアイデアを放棄することを強くお勧めします。 –

答えて

0

を生成作品:

const main = <T extends { [key: string]: Function }>(root: T) => <K extends keyof T>(method: K, ...args: any[]) => { 
    root[method].apply(this, args); 
}; 

code in playground

注意:Function.prototype.apply()は、2番目の引数として配列を想定しているため、スプレッド演算子を使用しないでください。

+0

答えをいただきありがとうございます。私はアップデートで対応しました(stackoverflowはコメントに長いリンクを挿入できません) –

関連する問題