Microsoft/TypeScript

Narrowed generic type is ignored in return type of callback passed to generic function

Open

#54,405 建立於 2023年5月26日

在 GitHub 查看
 (1 留言) (0 反應) (0 負責人)TypeScript (6,726 fork)batch import
BugDomain: check: Type InferenceHelp Wanted

倉庫指標

Star
 (48,455 star)
PR 合併指標
 (平均合併 6天 17小時) (30 天內合併 9 個 PR)

描述

Bug Report

See the code below. When returning a value with a narrowed generic type, the callback can't be assigned to a parameter whose return type is the same as the narrowed type. The error only happens when the callback is passed to a generic function (even when the generic isn't used for anything).

🔎 Search Terms

generic narrow callback return type

🕗 Version & Regression Information

I tried a bunch of versions in the playground, they all have the bug

⏯ Playground Link

Playground link with relevant code

💻 Code

type Union = number | string;
type Root = Record<string, Union>;

function noBug(cb: () => number) {}
function bug<T>(cb: () => number) {}

function foo<T extends Root>(root: T, key: keyof T) {
  const union = root[key];
  //    ^?

  noBug(() => {
    //     ^?
    if (typeof union === "string") throw new Error();
    return union;
    //     ^?
  });
  bug(() => {
    //   ^?
    if (typeof union === "string") throw new Error();
    return union;
    //     ^?
  });
}

🙁 Actual behavior

The call to bug results in this error: Argument of type '() => T[keyof T]' is not assignable to parameter of type '() => number'.

🙂 Expected behavior

The call to bug should have no errors, like the call to noBug.

貢獻者指南