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.

贡献者指南