microsoft / microsoft/TypeScript
Common fields of union not resolved for generic conditional with `any` branch
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 2 T. 4 Std.
- Gemergte PRs (30 T.)
- 132
Beschreibung
### 🔎 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
```ts
type InCommon = {common: string};
type Conditional = K extends number ? {one: number} : Record;
type UnionWithRegularConditional = InCommon | (Conditional & InCommon);
function exampleUnionWithRegular(key: K) {
const unionWithRegularConditional = {} as UnionWithRegularConditional;
// this works as expected
unionWithRegularConditional.common;
}
type ConditionalWithAny = K extends number ? any : Record;
type UnionWithAnyConditional = InCommon | (ConditionalWithAny & InCommon);
function exampleUnionWithAny(key: K) {
const unionWithAnyConditional = {} as UnionWithAnyConditional;
// this has a type error for `common` not existing on `ConditionalWithAny & InCommon`
unionWithAnyConditional.common;
// but then this *does* work
const propWithAnyConditional = {} as (ConditionalWithAny & 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_
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem verknüpften TypeScript Playground-Repro und bestätige den Unterschied zwischen dem regulären bedingten Typ und dem bedingten Typ mit einem `any`-Zweig. Verfolge die Behandlung gemeinsamer Eigenschaften in der resultierenden Union durch den Compiler und füge anschließend Abdeckung für `unionWithAnyConditional.common` hinzu. Fertig ist die Änderung, wenn der erwartete Zugriff nicht mehr meldet, dass `common` fehlt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 45/100