Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

renderHook (and rerender) doesn't properly infer overload type when using initialProps. #822

Open
rnarcos opened this issue Apr 11, 2022 · 4 comments
Labels
bug Something isn't working

Comments

@rnarcos
Copy link

rnarcos commented Apr 11, 2022

  • @react-testing-library/react version (if applicable): 12.1.2
  • @react-testing-library/react-hooks version: 7.0.2
  • react version: 15.4.2
  • react-dom version (if applicable): 15.4.2
  • node version:
  • npm (or yarn) version:

Relevant code or config:

function useFoo(foo: string): string;
function useFoo(foo: number): number;
function useFoo(foo: string | number): string | number {
  return foo;
}


test('should allow hook overloading on re-renders', () => {
  renderHook(useFoo, { initialProps: 'string' })
});

What you did:

I have a react hook, that relies on overloading to solve different use-cases. Essentially, this hook has an overload that determines the appropriate way to resolve a value based on its parameter typeof.

What happened:

When faced with an overloadable hook, @react-testing-library/react-hooks isn't appropriately typing either the initialProps for the renderHook method, or the rerender method itself.

Reproduction:

Reproduction

Problem description:

Hook overloading only works when you explicitly call the hook and return it's value on the renderHook method, while when using the renderHook with the initialValue option, it doesn't properly generate the types to match the overload.

@rnarcos rnarcos added the bug Something isn't working label Apr 11, 2022
@rnarcos
Copy link
Author

rnarcos commented Apr 11, 2022

Also, render result does not update its type definition based on the rerender output.

@alishi973
Copy link

We faced this issue even on the latest version (8.0.1), any idea?

@emericspiroux
Copy link

emericspiroux commented Oct 20, 2023

Salutations !

I think you doesn't use renderHook well.
You need to do this :

const { rerender } = renderHook((nextProps) => useMyHook(nextProps || initialProps)) 
rerender(myNextProps)

This solution work for me 👍


I think renderHook is not well designed to easily understand it and can be a good thing if in the future it can work like that :

const { render } = renderHook(useMyHook);
render(initialProps);
render(myNextProps);

@mpeyper
Copy link
Member

mpeyper commented Dec 19, 2023

Sorry I'm a bit late to the party here. I believe this is a known limitation of generic type inference of overloaded functions in Typescript.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants