-
Notifications
You must be signed in to change notification settings - Fork 13k
Open
Labels
Milestone
Description
π Search Terms
"conditional generics with any branch in union", "union with generic conditional branch"
π Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about conditional generics used in unions but didn't find anything that seemed relevant.
β― Playground Link
π» Code
type InCommon = {common: string};
type Conditional<K extends string | number> = K extends number ? {one: number} : Record<string, unknown>;
type UnionWithRegularConditional<K extends string | number> = InCommon | (Conditional<K> & InCommon);
function exampleUnionWithRegular<K extends string | number>(key: K) {
const unionWithRegularConditional = {} as UnionWithRegularConditional<K>;
// this works as expected
unionWithRegularConditional.common;
}
type ConditionalWithAny<K extends string | number> = K extends number ? any : Record<string, unknown>;
type UnionWithAnyConditional<K extends string | number> = InCommon | (ConditionalWithAny<K> & InCommon);
function exampleUnionWithAny<K extends string | number>(key: K) {
const unionWithAnyConditional = {} as UnionWithAnyConditional<K>;
// this has a type error for `common` not existing on `ConditionalWithAny<K> & InCommon`
unionWithAnyConditional.common;
// but then this *does* work
const propWithAnyConditional = {} as (ConditionalWithAny<K> & InCommon);
propWithAnyConditional.common;
}
π Actual behavior
When a union type contains a conditional generic whose branch is any
, the common fields of the union are not being correctly recognized.
This is illustrated above when TS is unable to recognize that common
is a field on unionWithAnyConditional
.
π Expected behavior
The expected behavior here is that common fields of the union should be correctly resolved.
From the above example, the expectation is that unionWithAnyConditional.common
would not have a "does not exist on type" error.
Additional information about the issue
No response