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

Tail type gives wrong results in specific recursive scenarios #1

Closed
TimonLukas opened this issue Mar 20, 2022 · 1 comment
Closed

Comments

@TimonLukas
Copy link

Hey there! Pretty cool library, thanks for sharing this. I could have recently needed this, it's good to know it exists! Though one tip, it would be helpful to add a link to the repository in your package.json, so the Github repository is linked on NPM :)

Anyways, here's the issue. There are some situations in which the Tail type will not work correctly, like this one (see on TS playground):

type Tail<List extends any[]> = List extends [infer _, ...infer Rest] ? Rest : []

type MatchEachLine<T extends string[]> =
  T extends [ head: string, ...tail: string[] ]
  ? MatchEachLine<Tail<T>>
  : never

This makes TS throw an error:

TS2344: Type 'Tail<T>' does not satisfy the constraint 'string[]'.
   Type 'unknown[] | []' is not assignable to type 'string[]'.
     Type 'unknown[]' is not assignable to type 'string[]'.
       Type 'unknown[]' is not assignable to type 'string[]'.
         Type 'unknown' is not assignable to type 'string'.

This should work, but TS somehow doesn't like this. Don't ask me why, hopefully it will be fixed in the future...

However, there is an alternative that fixes this and still fulfills all your existing tests (see on TS playground):

type Tail<List extends any[]> = ((...args: List) => any) extends (arg: any, ...rest: infer Rest) => any ? Rest : never
webNeat added a commit that referenced this issue Mar 21, 2022
@webNeat
Copy link
Owner

webNeat commented Mar 21, 2022

Hey @TimonLukas

Thank you for opening this issue and giving the solution, I am not sure why TS behave that way, I will try to dig deeper and understand where is this error coming from later. For now I applied your solution and released a new version.

Also thanks for the tip about the repository on package.json, I totally missed that 😅

Feel free to open other issues if you found other bugs.

@webNeat webNeat closed this as completed Mar 21, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants