borisyankov/DefinitelyTypedで定義されているD3.Layout.GraphNode
との定義を次に示します。D3.Layout.GraphLink
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
常にこれらのプロパティをすべて持つ必要はありません。たとえば、ここに aGraphLink
と asource: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
オプションにすることです。しかし、インターフェースは役に立たない。この場合、TypeScript の静的型付けを利用するにはどうすればよいですか?