microsoft / microsoft/TypeScript

Adding generic parameter to a lambda function removes typing from the function argument

Open
#29,060 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Bug Domain: check: Contextual Types
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

TypeScript Version: 3.2.2

Search Terms: generic removes parameter type

Code

// OKAY
// declare const labmda function with typings, then implement with minimal type annotations.
// "input" has type of "string".
export const foo: (input: string) => string
    = (input) => (input);

// OKAY
// declare const lambda generic function without typings, then implement with full inline type annotations.
// "input" has type of "string".
export const bar
    = <TResult>(input: string) => ({ } as Partial<TResult>);

// ERROR
// declare const labmda generic function with typings, then implement with minimal type annotations.
// "input" has type of "any".
export const baz: <TResult>(input: string) => Partial<TResult>
    = <TResult>(input) => ({ [input]: input } as Partial<TResult>);

Expected behavior:
input is typed as string.

Actual behavior:
input is typed as any.

Playground Link: https://www.typescriptlang.org/play/index.html#src=%2F%2F%20OKAY%0D%0A%2F%2F%20declare%20const%20labmda%20function%20with%20typings%2C%20then%20implement%20with%20minimal%20type%20annotations.%0D%0A%2F%2F%20%22input%22%20has%20type%20of%20%22string%22.%0D%0Aexport%20const%20foo%3A%20(input%3A%20string)%20%3D%3E%20string%0D%0A%20%20%20%20%3D%20(input)%20%3D%3E%20(input)%3B%0D%0A%0D%0A%2F%2F%20OKAY%0D%0A%2F%2F%20declare%20const%20lambda%20generic%20function%20without%20typings%2C%20then%20implement%20with%20full%20inline%20type%20annotations.%0D%0A%2F%2F%20%22input%22%20has%20type%20of%20%22string%22.%0D%0Aexport%20const%20bar%0D%0A%20%20%20%20%3D%20%3CTResult%3E(input%3A%20string)%20%3D%3E%20(%7B%20%7D%20as%20Partial%3CTResult%3E)%3B%0D%0A%0D%0A%2F%2F%20ERROR%0D%0A%2F%2F%20declare%20const%20labmda%20generic%20function%20with%20typings%2C%20then%20implement%20with%20minimal%20type%20annotations.%0D%0A%2F%2F%20%22input%22%20has%20type%20of%20%22any%22.%0D%0Aexport%20const%20baz%3A%20%3CTResult%3E(input%3A%20string)%20%3D%3E%20Partial%3CTResult%3E%0D%0A%20%20%20%20%3D%20%3CTResult%3E(input)%20%3D%3E%20(%7B%20%5Binput%5D%3A%20input%20%7D%20as%20Partial%3CTResult%3E)%3B

(NOTE: options -> noImplicitAny to have the issue highlighted as an error.)

Related Issues:

https://github.com/Microsoft/TypeScript/issues/18606
I think this issue might be related, but I don't understand it enough to judge.
If this is the same issue then the answer is "this is correct, and a limitation of the type system", which is fair enough.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the example in the linked TypeScript Playground with noImplicitAny enabled, then compare the three lambda declarations and the related issue #18606. Trace how contextual typing is applied to the generic lambda assignment. Done means determining whether the argument should be inferred as string and adding a regression test if the behavior is confirmed as a bug.

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
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.