Microsoft/TypeScript

Type modifier in mapped types break `any`

開放

#44,475 建立於 2021年6月7日

 (0 則留言) (0 個反應) (0 位負責人)TypeScript (13,395 個分叉)batch import
BugDomain: Mapped TypesHelp Wanted

倉庫指標

星標
 (108,860 顆星)
PR 合併指標
 (PR 指標待抓取)

描述

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.

貢獻者指南