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

mergeObjects has broken type definition #81

Closed
jam-fran opened this issue Jul 26, 2023 · 6 comments
Closed

mergeObjects has broken type definition #81

jam-fran opened this issue Jul 26, 2023 · 6 comments
Labels
🐛 bug Something isn't working

Comments

@jam-fran
Copy link

It appears that something's broken with mergeObjects' type definition in the generated utils.d.ts file. I've pasted portion of it below (only included a tiny sample, in the actual file it's thousands and thousands of lines long). In my IDE importing the function crashes the Typescript server and breaks all inferred types.

declare function mergeObjects<T extends unknown[] = unknown[]>(objs: T): (T extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_10]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_10 ? { [K_9 in keyof T_10]: (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_10]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_9]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_9 ? { [K_8 in keyof T_9]: (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_10]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_10 ? { [K_9 in keyof T_10]: (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_10]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_9]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_8]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_8 ? { [K_7 in keyof T_8]: (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_10]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_10 ? { [K_9 in keyof T_10]: (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_10]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_9]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_9 ? { [K_8 in keyof T_9]: (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)[K_10]; } : never : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_10 ? { [K_9 in keyof T_10]: (rest extends [infer first, ...infer rest] ? (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first) extends infer T_11 ? { [K_10 in keyof T_11]: (rest extends [infer first, ...infer rest] ? any : Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<Omit<{}, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first, keyof first> & first)

@gustavoguichard gustavoguichard added the 🐛 bug Something isn't working label Jul 27, 2023
@gustavoguichard
Copy link
Collaborator

Hey @jam-fran , thanks for reporting it. I'm gonna take a look at it later this week.

@gustavoguichard
Copy link
Collaborator

Hey @jam-fran , I investigated a little bit and realized the source of this bug is the Prettify type which should make the result of mergeObjects more readable. We'll probably have to rollback on that and sacrifice readability.

Remix team has faced that recently and they also had to rollback, check out the discussion if you want to learn more about it.

Thanks again for reporting it and I'll soon send the PR rolling it back.

@gustavoguichard
Copy link
Collaborator

Hey @jam-fran , it looks like the change will be a lil harder than I thought, could you provide me with an example that breaks the type so I can add a proper regression test for that?

@jam-fran
Copy link
Author

Hi @gustavoguichard -- thanks for looking into this.

Here's a minimal reproduction:

const funcA = makeDomainFunction(
  z.object({
    argA: z.boolean(),
    argB: z.string(),
  }),
)(({ argA, argB }) => {
  return { argA, argB }
})

const funcB = makeDomainFunction(
  z.object({
    argA: z.boolean(),
    argB: z.string(),
  }),
)(({ argA, argB }) => {
  return { foo: 'bar' }
})

const funcC = map(sequence(funcA, funcB), mergeObjects)

Here, typescript mistakenly thinks the result type of funcC is:

const funcC: DomainFunction<{
    foo: string;
}>

Hope this helps -- let me know if you need anything else.

@gustavoguichard
Copy link
Collaborator

Hi @jam-fran , thanks for clarifying! It helped a lot!

I strongly believe I fixed the bug in [email protected] , reopen the issue and LMK if that's not the case though ;)

The file with that problem used to be this one: https://www.unpkg.com/[email protected]/types/utils.d.ts
In the new version we can see how it looks a lot better already: https://www.unpkg.com/[email protected]/types/utils.d.ts

You can also see a reproduction of your code above in the TS playground. It seems to be working now 🚀

@jam-fran
Copy link
Author

jam-fran commented Aug 3, 2023

Looks great, thanks so much for your responsiveness here @gustavoguichard

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

2 participants