D3,Typescript和GraphNodes(打字稿界面中的可选字段)
问题描述:
以下是定义在borisyankov/DefinitelyTyped中的D3.Layout.GraphNode
和D3.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
,它们都没有所有的属性。
此外,我不能有一个类,如:
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静态类型?
答
所有这些都不需要但也许一些是和接口定义不反映为呢。也许你可以标记哪些是社区支持的可选项。
无论如何。当你想对他人强制执行严格的行为,但想要灵活地打破你的自我,你可以使用任何。例如:
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
}]
}
感谢您提供关于的小费。关于接口定义:似乎并不需要任何字段。正如你可以在这个要点中看到的:https://gist.github.com/ldub/5950248,d3引擎甚至自动生成'id'字段,以便链接的'source'和'target'属性'正常工作。我认为将可选字段标记为可选字段,并向DefinitelyTyped打开合并请求,但很难判断哪些字段是可选的! –
@LevDubinets这就是打字稿之前的生活:) – basarat
是的,我想,但在这种情况下,似乎打字稿不能解决它被创建来解决的问题。 –