antvis / G6

♾ A Graph Visualization Framework in JavaScript.
https://g6.antv.antgroup.com/
MIT License
11.04k stars 1.31k forks source link

The TypeScript type definition of the NodeEvent event object is incomplete #6346

Closed resetsix closed 1 day ago

resetsix commented 1 day ago

Describe the bug / 问题描述

背景描述

在使用 @antv/g6 v5时,我发现 NodeEvent 事件对象的类型定义似乎不完整。实际上,事件对象包含许多有用的属性,但当前的类型定义(IEvent)只包含 type 属性。这导致在使用 TypeScript 时无法获得正确的类型提示和自动补全。

预期行为

事件对象的类型定义应该包含所有可用的属性,如 targetbubblescancelBubble 等。

预期提示类型应该和实际打印的属性一致。如下图所示

图片

实际行为

事件对象的类型定义只包含 type 属性。

图片

Reproduction link / 重现链接

https://codesandbox.io/p/sandbox/wrtn8s?file=%2Fsrc%2FApp.tsx

Steps to Reproduce the Bug or Issue / 重现步骤

  1. 创建一个基本的 G6 图实例
  2. 为节点添加点击事件监听器
  3. 尝试在事件处理函数中访问事件对象的属性

G6 Version / G6 版本

🆕 5.x

Operating System / 操作系统

macOS

Browser / 浏览器

Firefox

Additional context / 补充说明

我只测试了 NodeEvent 事件对象类型,对于其他事件对象未做测试。

Aarebecca commented 1 day ago

目前你可以通过下列方式来手动声明事件对象类型:

import { NodeEvent } from '@antv/g6';
import type { IPointerEvent } from '@antv/g6';

graph.on(NodeEvent.CLICK, (event: IPointerEvent)=>{
  // handler
});
resetsix commented 1 day ago

目前你可以通过下列方式来手动声明事件对象类型:

import { NodeEvent } from '@antv/g6';
import type { IPointerEvent } from '@antv/g6';

graph.on(NodeEvent.CLICK, (event: IPointerEvent)=>{
  // handler
});

原来是这个。默认是IEvent类型,我就觉得不是这个。翻了好久文档都没找到事件对象的参数类型是哪个

Aarebecca commented 1 day ago

@resetsix IEvent 是一个联合类型,其中包括了多个基本的事件类型

export type IEvent =
  | IGraphLifeCycleEvent
  | IAnimateEvent
  | IElementLifeCycleEvent
  | IViewportEvent
  | IPointerEvent
  | IWheelEvent
  | IKeyboardEvent
  | IDragEvent;
resetsix commented 1 day ago

@resetsix IEvent 是一个联合类型,其中包括了多个基本的事件类型

export type IEvent =
  | IGraphLifeCycleEvent
  | IAnimateEvent
  | IElementLifeCycleEvent
  | IViewportEvent
  | IPointerEvent
  | IWheelEvent
  | IKeyboardEvent
  | IDragEvent;

的确是这样,但不知道为何IEvent对象最终只有一个类型,貌似被覆盖一样。

Aarebecca commented 1 day ago

@resetsix IEvent 是一个联合类型,其中包括了多个基本的事件类型

export type IEvent =
  | IGraphLifeCycleEvent
  | IAnimateEvent
  | IElementLifeCycleEvent
  | IViewportEvent
  | IPointerEvent
  | IWheelEvent
  | IKeyboardEvent
  | IDragEvent;

的确是这样,但不知道为何IEvent对象最终只有一个类型,貌似被覆盖一样。

指定为具体的事件类型就好了,目前还没提供相关的类型签名