Microsoft/TypeScript
View on GitHubContextual typing doesn't work when mixing up discriminated unions with function variant
Open
#62,306 opened on Aug 20, 2025
Domain: check: Contextual TypesHelp WantedPossible Improvement
Description
🔎 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.