Microsoft/TypeScript
Narrowed generic type is ignored in return type of callback passed to generic function
開放
#54,405 建立於 2023年5月26日
BugDomain: check: Type InferenceHelp Wanted
倉庫指標
- 星標
- (108,860 顆星)
- PR 合併指標
- (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.