innocces / taro-hooks

Hooks Library for Taro

Home Page:https://next-taro-hooks.pages.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

bug: useEvent的返回类型在TypeScript中的问题

Kaby-Lake opened this issue · comments

版本

  • typscript: 4.5.4
  • taro-hooks: 1.5.1
  • taro: 3.4.1
  • node: 16

复现步骤

在TypeScript的环境下,useEvent的返回类型有问题,会报 TS2339: Property 'emitEvent' does not exist on type 'IState | { dispatch: Dispatch ; setListener: (eventName: string, ...handlers: eventHandler[]) => void; setListenerOnce: (eventName: string, handler: eventHandler) => void; removeListener: (eventName?: string | undefined, handler?: eventHandler | undefined) => void; emitEvent: (eventName: string, ...params: a...'.

你期望的现象?

应当像useState一样返回一个typed list如[IState, ICallback]

可能的解决方案

源码中应在返回这个list后加 as const

ʕ •ᴥ•ʔ mark,年后修复一下

ʕ •ᴥ•ʔ mark,年后修复一下

我发现好多提供的hooks都没有加as const,建议都加上

ʕ •ᴥ•ʔ mark,年后修复一下

我发现好多提供的hooks都没有加as const,建议都加上

=。- 问一下。小伙伴是喜欢用 类似于

const numberState = useState(0);

numberState[1](2);   // 这种么?

ʕ •ᴥ•ʔ mark,年后修复一下

我发现好多提供的hooks都没有加as const,建议都加上

=。- 问一下。小伙伴是喜欢用 类似于

const numberState = useState(0);

numberState[1](2);   // 这种么?

你说的这种写法我倒没用过。

可能是我issue提的时候没讲细,比如说
Screen Shot 2022-02-10 at 12 22 52 AM这时候他会报错,如果看返回的state的类型定义的话
Screen Shot 2022-02-10 at 12 25 09 AM
会发现ts觉得返回的这个列表是(IState | { dispatch: Dispatch ; setListener: (eventName: string, ...handlers: eventHandler[])...)[]这个类型。因此他会觉得列表里的每一个元素都是IState | { dispatch: Dispatch ; setListener: (eventName: string, ...handlers: eventHandler[])...这个类型,而不知道其实第一个元素才是IState,而第二个是ICallback。

举个例子,如果看React的setState的定义的话,其实返回类型是[S, Dispatch<SetStateAction<S>>]这样的。

就是说对这个hooks而言,如果设计hooks的时候决定要返回一个list(有些ahooks会返回一个对象),应该返回[IState, ICallback]这样的类型,这样ts才知道列表中第一个元素是一个IState,第二个元素是一个ICallback对象,才不会报错。

比如我自己写的hooks返回的时候就会这样写
Screen Shot 2022-02-10 at 12 31 45 AM
这样这个hooks的返回类型就是没问题的
Screen Shot 2022-02-10 at 12 32 59 AM

ʕ •ᴥ•ʔ mark,年后修复一下

我发现好多提供的hooks都没有加as const,建议都加上

我通体检查了一遍,应该是只有useEvent没有定义返回类型。其他的都强制定义了返回类型。下个版本会为useEvent增加返回类型的定义。

(:з」∠) 暂时以 v1.5.3 发布解决。若发现其他问题重新打开此问题即可