1

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ますが、どちらもすべてのプロパティを持っているわけではありません。

すべてのフィールドが定義されていない D3.Layout.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 の静的型付けを利用するにはどうすればよいですか?

4

1 に答える 1

1

それらのすべてが必須というわけではありませが、おそらく一部は必須であり、インターフェース定義はまだそれを反映していません。おそらく、コミュニティ サポートのオプションであるものをマークすることができます。

いかなる場合でも。他の人に厳格な行動を強制したいが、自分自身を打ち破る柔軟性が必要な場合は、any を使用できます。例:

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
    }]
}
于 2013-07-08T03:06:45.297 に答える