Microsoft/TypeScript

Common fields of union not resolved for generic conditional with `any` branch

Open

#62466 opened on Sep 18, 2025

View on GitHub
 (0 comments) (0 reactions) (0 assignees)TypeScript (48,455 stars) (6,726 forks)batch import
BugDomain: Conditional TypesHelp Wanted

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

https://www.typescriptlang.org/play/?ts=5.9.2#code/C4TwDgpgBAkgdgYQPYFsVLlAvFA3gY1XTgC4oBnYAJwEs4BzAXwG4AoV0SKZOAExuA0MAQwA2AHgDSUCAA9gEPuQrU69KAB8ocAK4oARhCoA+bFGlyFS7XsNUoAfjwYIZXQaOMoZAEoRCVLzilLQMADRQOnAA1nBIAO5wxmyc0ACqcEJwAOoCABZ+9DqiwlQ8-IIiEhbyirzKIWqaNh4mZvDIaBjNABTlAlliUqYAZLCIRBgAlGwAZlH4lZhywihgohAZWbnABRBFJVRSMrXWjQzN7nbGPdEQIGSSU3isUG9QhHCUkZkYO3sHUr9JZiMy4LzCZRbP75QrFIEYCqDarJV7vAD06KguxoyniSCo0WUkJOkEWEF4aLeUW2sP28LKiIGVQAdIQunA2Ix2KluEyQaJ-gBBOAgY6WOoNVQXLRXIymHA1Kz1Fp2RxQYSi7xQPwBILnegRKKxBJJFLgdK-HL5EUgYHI8WnFUGy62eXtCYc3r2qrC0XDKBjDqTOAzVjzOCLLInVbrTZWv1ipWSlShdSyt0mW73R7PXBUj4Yb40mG7W0+uCgnDgjVQhM20UVoaSVHvKCY7F5XFQPIk4TYi0yKhUAlQWajgAG7OIE+0SGAJ1xggu3QnTcFDaTo3GnRnBZL1rLjf5yLZIbYbYLHf0OgXu0Une7ACpeEgIOQn1B8YSC59vmARzARN1zBCFlD6E9fU3AMg09YgwzbACkCAzd1zPDkuVYIA

💻 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

Contributor guide