d3.min / max函数返回string
而不是number
。
var nonEmptySets = [];
this.data.forEach(function(ds) { //data: Array<Array<[number, number]>>
if(ds && ds.length > 0) {
nonEmptySets.push(ds);
}
})
var max = d3.max(nonEmptySets[0], function(d) { return d[1]; }); //max: string
我知道我可以将max的值转换为number
,但是我不明白为什么函数会返回string
。
答案 0 :(得分:3)
我遇到了同样的问题。
深入研究@types/d3
的源代码后,我发现d3.max
有4个重载:
/**
* Return the maximum value in the array of strings using natural order.
*/
export function max(array: ArrayLike<string>): string | undefined;
/**
* Return the maximum value in the array of numbers using natural order.
*/
export function max<T extends Numeric>(array: ArrayLike<T>): T | undefined;
/**
* Return the maximum value in the array using natural order and a projection function to map values to strings.
*/
export function max<T>(array: ArrayLike<T>, accessor: (datum: T, index: number, array: ArrayLike<T>) => string | undefined | null): string | undefined;
/**
* Return the maximum value in the array using natural order and a projection function to map values to easily-sorted values.
*/
export function max<T, U extends Numeric>(array: ArrayLike<T>, accessor: (datum: T, index: number, array: ArrayLike<T>) => U | undefined | null): U | undefined;
原因是d3.max
不知道您传递的数据类型,因此它试图在第三种情况下适合它,该情况返回string | undefined
。
因此,如果您希望提供访问器并期望max
返回访问器返回的新数据类型,则应该
都为d3.max
的第一个参数提供类型,如下所示:
var nonEmptySets: Array<Array<[number, number]>> = [];
或像这样覆盖T
和U
:
var max = d3.max<[number, number], number>(nonEmptySets[0], function(d) { return d[1];
});
然后您会得到max: number
。
答案 1 :(得分:0)
我找到了解决方案。
而不是var nonEmptySets = []
应该是let nonEmptySets: Array<Array<[number,number]>> = []
添加类型可以解决问题。
答案 2 :(得分:-1)
D3.max不执行任何类型转换。如果您输入字符串,它将返回字符串。
此外,使用自然顺序而不是数字顺序比较元素。例如,字符串[“ 20”,“ 3”]的最大值为“ 3”,而数字[20,3]的最大值为20。