Typescript中的d3.max(...)返回一个字符串

时间:2018-11-26 11:46:14

标签: typescript d3.js

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

3 个答案:

答案 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]>> = [];
    
  • 或像这样覆盖TU

    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。

d3-array