Narrowed generic type is ignored in return type of callback passed to generic function
#54.405 geöffnet am 26. Mai 2023
Repository-Metriken
- Stars
- (48.455 Stars)
- PR-Merge-Metriken
- (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)
Beschreibung
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.