Microsoft/TypeScript

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

Open

#54 405 ouverte le 26 mai 2023

Voir sur GitHub
 (1 commentaire) (0 réactions) (0 assignés)TypeScript (6 726 forks)batch import
BugDomain: check: Type InferenceHelp Wanted

Métriques du dépôt

Stars
 (48 455 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (9 PRs mergées en 30 j)

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.

Guide contributeur