Microsoft/TypeScript

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

Open

#54.405 aberto em 26 de mai. de 2023

Ver no GitHub
 (1 comment) (0 reactions) (0 assignees)TypeScript (6.726 forks)batch import
BugDomain: check: Type InferenceHelp Wanted

Métricas do repositório

Stars
 (48.455 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)

Description

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.

Guia do colaborador