Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Common fields of union not resolved for generic conditional with any branchΒ #62466

@awfulstew

Description

@awfulstew

πŸ”Ž 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions