2017-03-22 188 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中,函数是一个对象,所以在技术上这没有问题。我通常也会避免这种情况,但有时候很高兴有这个选择 –