Microsoft/TypeScript
在 GitHub 查看Contextual typing doesn't work when mixing up discriminated unions with function variant
Open
#62,306 建立於 2025年8月20日
Domain: check: Contextual TypesHelp WantedPossible Improvement
倉庫指標
- Star
- (48,455 star)
- PR 合併指標
- (平均合併 6天 17小時) (30 天內合併 9 個 PR)
描述
🔎 Search Terms
contextual typing, discriminated unions
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries
- Tested with TS 5.4.5 and TS 5.9.2
⏯ Playground Link
💻 Code
type NotWorkingUnion =
| ((value: number) => void)
| {
isString: true;
fn: ((value: string) => void);
}
| {
isString?: false;
fn: ((value: number) => void);
};
const test1: NotWorkingUnion = (a) => {}; // Works
const test2: NotWorkingUnion = { // Works
isString: true,
fn: (a) => {}
};
const test3: NotWorkingUnion = { // Works
isString: false,
fn: (a) => {}
};
const test4: NotWorkingUnion = { // Doesn't work!
fn: (a) => {}
};
type WorkingUnion =
| {
isString: true;
fn: ((value: string) => void);
}
| {
isString?: false;
fn: ((value: number) => void);
};
const test5: WorkingUnion = { // Works
isString: true,
fn: (a) => {}
};
const test6: WorkingUnion = { // Works
isString: false,
fn: (a) => {}
};
const test7: WorkingUnion = { // Works
fn: (a) => {}
};
🙁 Actual behavior
Contextual typing breaks when an union is both discriminated by a field and one of the union variants is just a function
🙂 Expected behavior
Contextual typing should correctly work, as the type system should have enough information to discriminate between a function and an object with or without the field
Additional information about the issue
strict mode is enabled.