测试用打字稿编写的自定义反应钩子
我有一个用 TS 编写的自定义钩子 useForm
,它工作得很好。使用@testing-library/react-hooks 进行测试。测试通过。但是打字稿在一个特定的地方抱怨 - 见下文:
这是自定义挂钩:
import { useState } from 'react';
export function useForm<T>(initialValues: T) {
const [values, setValues] = useState(initialValues);
return {
values: values,
handleChange: (e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {
setValues({
...values,
[e.target.name]: e.target.value,
});
},
reset: () => setValues(initialValues),
};
}
这是测试:
import { renderHook, act } from '@testing-library/react-hooks';
import { useForm } from './useForm';
test('should render useForm hook', () => {
const { result } = renderHook(() =>
useForm({
text: 'Note One',
}),
);
expect(result.current).toBeDefined();
expect(result.current.values.text).toBe('Note One');
act(() => {
result.current.handleChange({
target: { //complains here - Type '{ name: string; value: string; }' is not assignable to type 'EventTarget & (HTMLTextAreaElement | HTMLInputElement)'.
name: 'text',
value: 'Note Two',
},
});
});
expect(result.current.values.text).toBe('Note Two');
act(() => {
result.current.reset();
});
expect(result.current.values.text).toBe('Note One');
});
这是一个工作代码沙箱:https://codesandbox.io/s/flamboyant-curie-6i5moy?file=/src/useForm.test.tsx
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我将使用 change 事件>Event() 构造函数。并使用
Object.defineProperty(event, 'target', {value: {}, writable: false})
设置此事件的事件目标,另请参阅此 答案。然后使用类型转换事件作为未知作为React.ChangeEvent
转换事件。例如
I will create a
change
event by using Event() constructor. And set the event target for this event by usingObject.defineProperty(event, 'target', {value: {}, writable: false})
, also see this answer. Then use type castingevent as unknown as React.ChangeEvent<HTMLInputElement>
cast the event.E.g.
你可以简单地投射它:
You can simply cast it:
我遇到了同样的问题,这就是解决方法。
这为我解决了这个问题。
I got into this same problem this was the fix.
This fixed it for me.