2017-03-22 104 views
1

我遇到了需要使用第三方接口(更具體地說是D3)創建類的情況。使用匿名函數的Typescript類實現接口

我想創建一個實現D3.Force接口的類,但是我的編譯器不會擁有它。

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

這引發以下錯誤:

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

通過檢查定義D3.Force,我看到以下內容:

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中,函數是一個對象,所以在技術上這沒有問題。我通常也會避免這種情況,但有時候很高興有這個選擇 –