BugDomain: Mapped TypesHelp Wanted
描述
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.