带有definitlyTyped的d3js的打字稿

时间:2015-07-22 13:34:58

标签: c# asp.net-mvc d3.js typescript

所以,这是我打字稿的第一天。

我遇到了这段代码的麻烦:

  var x: d3.scale.Ordinal = d3.scale.ordinal()
            .rangeRoundBands([0, +this.params.width], .1)
            .domain(data.map(function (d) {
                return d.DayName;
            }));

我希望x是类型序数比例,但由于某种原因我得到这个错误:

Generic type 'Ordinal<Domain, Range>' requires 2 type argument(s).

在DefinitlyTyped的代码中确实可以看到以下内容:

 interface Ordinal<Domain extends { toString(): string }, Range> {
        (x: Domain): Range;

        domain(): Domain[];
        domain(values: Domain[]): Ordinal<Domain, Range>;

        range(): Range[];
        range(values: Range[]): Ordinal<Domain, Range>;

        rangePoints(interval: [number, number], padding?: number): Ordinal<Domain, number>;
        rangeRoundPoints(interval: [number, number], padding?: number): Ordinal<Domain, number>;

        rangeBands(interval: [number, number], padding?: number, outerPadding?: number): Ordinal<Domain, number>;
        rangeRoundBands(interval: [number, number], padding?: number, outerPadding?: number): Ordinal<Domain, number>;

        rangeBand(): number;
        rangeExtent(): [number, number];

        copy(): Ordinal<Domain, Range>;
    }

所以Ordinal需要有2个额外的类型,Domain和range,但我无法找到他们的结构。

我该如何解决这个问题?或者我误解了什么?

1 个答案:

答案 0 :(得分:1)

范围是泛型类型参数,它们是您需要提供的类型的占位符,而不是实际的具体类型。 可以是具有 toString 方法的任何类型,范围显然可以是您想要的任何类型。

DefinitelyTyped存储库中的输入通常会进行一些测试以确保打字工作符合预期,如果您正在尝试弄清楚如何正确使用某些类型,那么良好的第一步就是查看这些测试。以下是D3 tests

的相关示例
var fill = d3.scale.ordinal<number, string>()
    .domain(d3.range(4))
    .range(["#000000", "#FFDD89", "#957244", "#F26223"]);

所以我觉得这对你有用:

var x: d3.scale.Ordinal<string, number> = d3.scale.ordinal<string, number>()
        .rangeRoundBands([0, +this.params.width], .1)
        .domain(data.map(function (d) {
            return d.DayName;
        }));

或者你可以让编译器推断出变量的类型:

var x = d3.scale.ordinal<string, number>()
        .rangeRoundBands([0, +this.params.width], .1)
        .domain(data.map(function (d) {
            return d.DayName;
        }));

如果你不熟悉TypeScript中的泛型类型,我建议你阅读TypeScript手册中的section on Generics