Microsoft/TypeScript
Auf GitHub ansehenConditional type eagerly calculated to be invariant breaks referential transparency
Open
#62.798 geöffnet am 23. Nov. 2025
BugCursed?Domain: check: Variance RelationshipsHelp Wanted
Repository-Metriken
- Stars
- (48.455 Stars)
- PR-Merge-Metriken
- (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)
Beschreibung
🔎 Search Terms
Conditional types, Invariance, Referential transparency
🕗 Version & Regression Information
Tried with v5.9.3
⏯ Playground Link
💻 Code
type F<T> = { value: T extends object ? keyof T : T }
type R1 = F<{}> extends F<{ a: string }> ? "holds" : "does not hold"
// ^? "does not hold"
type Fa = F<{}>
type Fb = F<{ a: string }>
type R2 = Fa extends Fb ? "holds" : "does not hold"
// ^? "holds"
🙁 Actual behavior
R1 computes to "does not hold"
🙂 Expected behavior
R1 computes to "holds"
Additional information about the issue
I'm assuming typescript eagerly calculates F to be invariant and then instead of checking the subtype relation on resolved types it calculates subtype relation of the parameters to F. (This would perhaps have made sense if F was explicitly annotated with in out T.)