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提的时候没讲细,比如说
这时候他会报错,如果看返回的state的类型定义的话
会发现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对象,才不会报错。
ʕ •ᴥ•ʔ mark,年后修复一下
我发现好多提供的hooks都没有加as const,建议都加上
我通体检查了一遍,应该是只有useEvent没有定义返回类型。其他的都强制定义了返回类型。下个版本会为useEvent增加返回类型的定义。
(:з」∠) 暂时以 v1.5.3 发布解决。若发现其他问题重新打开此问题即可