2013-07-08 36 views
0

以下是定义在borisyankov/DefinitelyTyped中的D3.Layout.GraphNodeD3.Layout.GraphLink的定义。D3,Typescript和GraphNodes(打字稿界面中的可选字段)

export interface GraphNode { 
     id: number; 
     index: number; 
     name: string; 
     px: number; 
     py: number; 
     size: number; 
     weight: number; 
     x: number; 
     y: number; 
     subindex: number; 
     startAngle: number; 
     endAngle: number; 
     value: number; 
     fixed: bool; 
     children: GraphNode[]; 
     _children: GraphNode[]; 
     parent: GraphNode; 
     depth: number; 
    } 


    export interface GraphLink { 
     source: GraphNode; 
     target: GraphNode; 
    } 

但是,GraphNode不一定总是具有所有这些属性。例如,这里是一个GraphLink,其中一个source:GraphNode和一个target:GraphNode,它们都没有所有的属性。

D3.Layout.GraphNode which does not have all the fields defined

此外,我不能有一个类,如:

class GraphData { 
    nodes: D3.Layout.GraphNode[]; 
    links: D3.Layout.GraphLink[]; 
} 

因为那时做这不起作用:

var data:GraphData = { 
    "nodes": [{ 
     "group": 0, 
     "id": 0 
    }, { 
     "group": 0, 
     "id": 1 
    }, { 
     "group": 0, 
     "id": 2 
    }], 
    "links": [{ 
     "source": 0, 
     "target": 2, 
     "value": 1 
    }, { 
     "source": 0, 
     "target": 0, 
     "value": 1 
    }, { 
     "source": 2, 
     "target": 1, 
     "value": 1 
    }, { 
     "source": 2, 
     "target": 1, 
     "value": 1 
    }] 
} 

的打字稿编译器给了我这个错误:

Compile Error. 
See error list for details 
C:/Projects/MyGraph/app.ts(111,23): error TS2082: Supplied parameters do not match any signature of call target: 

Types of property 'nodes' of types '{ "nodes": { "group": number; "id": number; }[]; "links": { "source": number; "target": number; "value": number; }[]; }' and 'GraphData' are incompatible: 

Type '{ "group": number; "id": number; }' is missing property 'index' from type 'D3.Layout.GraphNode'. 

解决此问题的一种方法是使接口GraphNode中的所有字段可选。但接口是没用的。 如何在这种情况下利用TypeScripts静态类型?

回答

1

所有这些都不需要也许一些是和接口定义不反映为呢。也许你可以标记哪些是社区支持的可选项。

无论如何。当你想对他人强制执行严格的行为,但想要灵活地打破你的自我,你可以使用任何。例如:

var data:GraphData = <any>{ 
    "nodes": [{ 
     "group": 0, 
     "id": 0 
    }, { 
     "group": 0, 
     "id": 1 
    }, { 
     "group": 0, 
     "id": 2 
    }], 
    "links": [{ 
     "source": 0, 
     "target": 2, 
     "value": 1 
    }, { 
     "source": 0, 
     "target": 0, 
     "value": 1 
    }, { 
     "source": 2, 
     "target": 1, 
     "value": 1 
    }, { 
     "source": 2, 
     "target": 1, 
     "value": 1 
    }] 
} 
+0

感谢您提供关于的小费。关于接口定义:似乎并不需要任何字段。正如你可以在这个要点中看到的:https://gist.github.com/ldub/5950248,d3引擎甚至自动生成'id'字段,以便链接的'source'和'target'属性'正常工作。我认为将可选字段标记为可选字段,并向DefinitelyTyped打开合并请求,但很难判断哪些字段是可选的! –

+0

@LevDubinets这就是打字稿之前的生活:) – basarat

+0

是的,我想,但在这种情况下,似乎打字稿不能解决它被创建来解决的问题。 –