Zoeken op website

d3.js - d3.max(...) in Typescript retourneert een string


De d3.min/max-functie retourneert een string in plaats van een nummer.

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

Ik weet dat ik de waarde van max kan omzetten naar een number, maar ik begrijp niet waarom de functie een string retourneert.

Antwoord #1

Ik had hetzelfde probleem.

Na het doorgraven van de broncode van @types/d3 ontdekte ik dat er 4 overbelastingen van d3.max zijn:

/**
 * 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;

De reden is dat d3.max het type gegevens dat je doorgeeft niet kent, dus probeert het het in het derde geval te passen, wat string | undefined retourneert.

Dus als je een accessor wilt bieden en verwacht dat max een nieuw gegevenstype retourneert dat door de accessor wordt geretourneerd, zou je

  • geef ofwel typen op voor het eerste argument van d3.max zoals dit:

    var nonEmptySets: Array<Array<[number, number]>> = [];
    
  • of overschrijf T en U zoals dit:

    var max = d3.max<[number, number], number>(nonEmptySets[0], function(d) { return d[1]; 
    });
    

Dan krijg je max: number.

Antwoord #2

D3.max voert geen typeconversie uit. Als je een string invoert, zal het een string retourneren.

Bovendien worden elementen vergeleken op basis van de natuurlijke volgorde in plaats van de numerieke volgorde. Bijvoorbeeld, het maximum van de strings ["20 ", "3 "] is "3", terwijl het maximum van de getallen [20, 3] 20 is.

d3-array

Gerelateerde artikelen