microsoft / microsoft/TypeScript
Type modifier in mapped types break `any`
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.4k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
Bug Report
🔎 Search Terms
mapped types, any, contravariance, type modifiers
🕗 Version & Regression Information
4.3.2
⏯ Playground Link
(the playground seems down for me, but I'll update the ticket when I can)
💻 Code
// Adding/removing `-?` makes the `anyCallback` line flip between broken/working
type Mapped<T> = { [K in keyof T]-?: number };
type Callback<T> = (object: Mapped<T>) => void;
const fn: Callback<{ firstName: string }> = () => {};
const anyCallback: Callback<any> = fn;
🙁 Actual behavior
The anyCallback = fn line causes an error:
TS2322: Type 'Callback<{ firstName: string; }>' is not assignable to type 'Callback<any>'.
Types of parameters 'object' and 'object' are incompatible.
Property 'firstName' is missing in type 'Mapped<any>' but required in type 'Mapped<{ firstName: string; }>'.
🙂 Expected behavior
I expect to be able to assign Callback<{ firstName: string} to Callback<any> because { firstName: string } should be considered any.
If I remove the -? type modifier in the Mapped type, then this works as expected.
Which leads me to the naive assertion that "the type modifier breaks any".
Note it's only the required type modifier -?, the required modifier +? doesn't cause the compile error.
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 by reproducing the TypeScript 4.3.2 example with the mapped type, -? modifier, and Callback<any> assignment. Investigate the compiler's mapped-type and assignability handling; done means the reported assignment behaves as expected without regressing the differing behavior of the type modifiers.
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
- 35/100