Narrowed generic type is ignored in return type of callback passed to generic function
#54.405 aperta il 26 mag 2023
Metriche repository
- Star
- (48.455 star)
- Metriche merge PR
- (Merge medio 6g 17h) (9 PR mergiate in 30 g)
Descrizione
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.