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.maxzoals dit:var nonEmptySets: Array<Array<[number, number]>> = [];of overschrijf
TenUzoals 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
