Fel*_*aro 7 events types d3.js typescript
我有一组使用 d3(版本 5)开发的小部件,现在我必须将它们迁移到版本 7。在迁移指南https://observablehq.com/@d3/d3v6-migration-guide中,我已经了解了事件的新语法:
\n// before\nelement.on(\'click\', (d, i, e) => ...\n\n\n// now\nelement.on(\'click\', (event, d) => ...\n
Run Code Online (Sandbox Code Playgroud)\n一旦我切换到新语法,程序就再次开始运行。耶!
\n现在的问题是我在这个项目中使用了 typescript!虽然我已经安装了最新的@types/...
\n "dependencies": {\n "d3": "^7.1.1",\n ...\n\n "devDependencies": {\n "@types/d3": "^7.1.0",\n ...\n
Run Code Online (Sandbox Code Playgroud)\n...当涉及到事件时,我一直在类型定义和智能感知方面遇到麻烦。
\n// 1. before (Worked fine)\nelement.on(\'click\', (d: MyData, i: number, e: whatever[]) => ...\n\n\n// 2. introducing types == Error back! \xe2\x9d\x8c \nelement.on(\'click\', (event: PointerEvent, d: MyData) => ...\n\n\n// 3. then, my (ugly) workaround:\nelement.on(\'click\', (event: any , d: any) => ...\n
Run Code Online (Sandbox Code Playgroud)\n有趣的是,虽然我安装了 @types/d3 v7.0.1,但 Typings 系统看起来仍然保留对旧 v5 格式的引用。不知何故,智能感知仍然认为我的第一个参数是数据,第二个参数是数字索引:
\n\n\n...但在现实生活中我得到的是 { event: PointerEvent, d: MyData },如下图所示。
\n\n因此,简而言之,感觉 D3 的类型声明存在问题,因为 Intellisense 认为事件仍然采用 v5 格式,而在现实生活中却并非如此。
\n有谁知道如何解决这个打字问题?\n必须将“any”分配给我的事件中的整个事情,这真的很烦人。
\nD3Event
我通过向我的代码库添加一个接受 2 个类型参数的实用程序类型来解决这个问题:
export type D3Event<T extends Event, E extends Element> = T & { currentTarget: E }
Run Code Online (Sandbox Code Playgroud)
然后我可以这样使用它:
selection.on('mouseover', (event: D3Event<MouseEvent, SVGGElement>, d: SomeType) => { ... }
Run Code Online (Sandbox Code Playgroud)
它有点冗长,但比any
归档时间: |
|
查看次数: |
1365 次 |
最近记录: |