2017-03-22 28 views
1

サードパーティのインターフェイス(特にD3)を使用してクラスを作成する必要がある状況に直面しています。匿名関数を使用したインターフェイスを実装するTypescriptクラス

私はD3.Forceインターフェイスを実装するクラスを作成したいのですが、私のコンパイラはそれを持っていません。

class CustomForce<NodeDatum extends D3.SimulationNodeDatum> implements D3.Force<NodeDatum, any> { 
    // Some more code at some point 
} 

これは、次のエラースロー:D3.Forceの定義を調べて

Class 'CustomForce<NodeDatum>' incorrectly implements interface 'Force<NodeDatum, any>'. 
Type 'CustomForce<NodeDatum>' provides no match for the signature '(alpha: number): void' 

を、私は、以下を参照してください。

export interface Force<NodeDatum extends SimulationNodeDatum, LinkDatum extends SimulationLinkDatum<NodeDatum> | undefined> { 
    (alpha: number): void; 
    initialize?(nodes: NodeDatum[]): void; 
} 

どのように私は取って無名関数を実装します引数としてalpha ?!

答えて

2

この種のインターフェイスを実装するクラスを作成することはできません。
インターフェイスは、関数であるinitializeというプロパティも持っている関数を定義しています。私が知っている限り、クラスを使ってそのことを行うことはできません。

ただし、これを行うことができます。

function CustomForce<NodeDatum extends D3.SimulationNodeDatum>(): D3.Force<NodeDatum, any> { 
    const force = function(alpha: number): void { 
     ... 
    } 

    force.initialize = function(nodes: NodeDatum[]) { 
     ... 
    } 

    return force; 
} 
+0

は、私のような疑いがあります。しかし、メソッドを持つTypescriptで関数を作成するのは間違っています... –

+0

jsでは関数はオブジェクトなので、技術的に問題はありません。私もそれを避けるのが普通ですが、そのオプション –

関連する問題