microsoft / microsoft/TypeScript
Generic function passed to generic function inferred correctly only with spread
Open
Nobody has claimed this yet.
Domain: check: Type Inference
Help Wanted
Possible Improvement
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
🔎 Search Terms
generic function spread regression inference
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about generics
⏯ Playground Link
💻 Code
export type Node = { };
declare function fooooooo<T, Result extends ArrayLike<unknown>, Evil extends readonly unknown[]>(
input: T,
callback: (input: T, prev: Result, ...evil: Evil) => Result,
): Result
declare function baaaaaar<T, Result extends ArrayLike<unknown>>(
input: T,
callback: (input: T, prev: Result) => Result,
): Result
declare function callback<T>(
input: T,
prev: string[],
): string[];
export function example<T>(input: T) {
// Infers type parameter Result correctly
fooooooo(input, callback);
// ^? function fooooooo<T, string[], []>(input: T…
// Fails to infer type parameter Result correctly instead infers the constraint
baaaaaar(input, callback);
// ^? function baaaaaar<T, ArrayLike<unknown>>(in…
// Bypassing inference, the function call is correct
baaaaaar<T, string[]>(input, callback);
// Infers type parameter Result correctly
baaaaaar(input, callback<T>);
// ^? function baaaaaar<T, string[]>(input: T, ca…
}
🙁 Actual behavior
baaaaaar(input, callback) infers the constraint of Result = ArrayLike<unknown>
🙂 Expected behavior
baaaaaar(input, callback) should infer Result = string[] from the return type or parameter of callback.
Additional information about the issue
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked TypeScript Playground reproduction and compare the inferred types for the two generic calls. Trace how the callback's return type and parameters contribute to inferring Result. Done means baaaaaar(input, callback) infers Result as string[] without explicit type arguments or callback specialization.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100