Forum Discussion
Problem using "d3-array".rollup (and it spread argument) in a Power BI Custom Visual
- 6 years ago
Hi Schizzomarino ,
Sorry, but I took a shot before trying it myself. But if I change the key attribute to ...key: any[] I can get your code working.
I do realise that the typing are a bit off now, but looks like TypeScript doesn't work correctly with this type of parameter binding.
But the most important thing: it compiles!
-JP
Thanks Evgenii v-evelk ,
I am using pbiviz 3.1.5 and have imported the rollup function from d3-array as such:
- import { rollup } from "d3-array"
(I have also installed the types for d3 and it)
- npm install --save @types/d3
- npm install --save @types/d3-array
And when only one key is used the rollup function works, it looks to me the problem resides in recognising and using the spread operator that is part of the arguments for rollup.
I am thinking it might be a typescript limitation rather than Power BI, but was hoping for a workaround that would allow me to use the data functions within d3 (rather than recoding them in typescript myself)
best,
Daniel
Hi Schizzomarino ,
It looks to me that it is an issue with the current typedefinitions (@types/d3-array) as the current only accepts one key, see: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/cbcfdd4b12b863a82f5f1903c47fe22fa3b6975c/types/d3-array/index.d.ts#L245 There is already an issue reported, but with not much happening: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/32162
This kind of errors are usually related to outdated typedefinitions used by TypeScript and you can easily update the current typedefiniton and add the missing '...'
-JP
- Schizzomarino6 years agoAdvocate I
Thanks jppp ,
I had not noticed this... Just goes to show how I still need to learn about definitions in typescript
So looking at the type definition I found this
/*
@param a The array to group.@param reduce The reduce function.@param key The key function.*/export function rollup<TObject, TKey, TReduce>(a: Iterable<TObject>, reduce: (value: TObject[]) => TReduce, key: (value: TObject) => TKey) : Map<TKey, TReduce>;Unfortunately I can't figure where to insert the spread operator here, would someone know how to change it, so the above line from the type definitions file provides the third argument as a spread one (key/TReduce)?Thanks again JPDaniel- jppp6 years agoContinued Contributor
Hi Schizzomarino ,
You can adjust your local version in the node_modules/@types/d3-array folder.
And I think you only need to add the spread '...' before the key parameter:
export function rollup<TObject, TKey, TReduce>(a: Iterable<TObject>, reduce: (value: TObject[]) => TReduce, ...key: (value: TObject) => TKey) : Map<TKey, TReduce>;
-JP
- Schizzomarino6 years agoAdvocate I
Hi jppp ,
I had tried that amongst a whole pletora of other combinations; but Visual Studio will not compile this... I get the following tooltip:
I have tried so many variations but can't find one that works; and I found this discussion on this:
https://stackoverflow.com/questions/51737041/mapping-generic-spreaded-argument-types-in-typescriptFor now I can't quite wrap my head around the technical topic in the above thread... I finsd it rather complicated, probably why it has taken two years, so far, to not have it fixed :-0
Would anyone know how to get this to work? It would be great after two years to find this solution and update the types mapping for d3-array in the git repository
Thanks again jppp for pointing me in the right direction, but before I set yours as the correct answer I want to see if anyone has code that will work to define spread arguments when exporting types definitions in Typescript