所以,这是我打字稿的第一天。
我遇到了这段代码的麻烦:
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,但我无法找到他们的结构。
我该如何解决这个问题?或者我误解了什么?
答案 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。