π Search Terms
Conditional types, Invariance, Referential transparency
π Version & Regression Information
Tried with v5.9.3
β― Playground Link
https://www.typescriptlang.org/play/?ts=5.9.3#code/C4TwDgpgBAYgPAFQHxQLxQN5QG4EMA2ArhAFxQJQQAewEAdgCYDOUA9gEYBWEAxsFAH4oAawghWAM3JQyFAL4AoBaEhQASgEY0sOBjkpqtRi3hZcZJsABOASzoBzKPsFQARAAtW+Zq5luGrBAsdKz8nt6uCgD0UVBxAHoCSirQMLjapvrK4KnsGbpQ5lCWtg5OSMk56gBMGemG9MyweUIeXj5+rgFBUCFh7ZExcVCJCkA
π» 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.)
π Search Terms
Conditional types, Invariance, Referential transparency
π Version & Regression Information
Tried with v5.9.3
β― Playground Link
https://www.typescriptlang.org/play/?ts=5.9.3#code/C4TwDgpgBAYgPAFQHxQLxQN5QG4EMA2ArhAFxQJQQAewEAdgCYDOUA9gEYBWEAxsFAH4oAawghWAM3JQyFAL4AoBaEhQASgEY0sOBjkpqtRi3hZcZJsABOASzoBzKPsFQARAAtW+Zq5luGrBAsdKz8nt6uCgD0UVBxAHoCSirQMLjapvrK4KnsGbpQ5lCWtg5OSMk56gBMGemG9MyweUIeXj5+rgFBUCFh7ZExcVCJCkA
π» Code
π Actual behavior
R1computes to"does not hold"π Expected behavior
R1computes to"holds"Additional information about the issue
I'm assuming typescript eagerly calculates
Fto be invariant and then instead of checking the subtype relation on resolved types it calculates subtype relation of the parameters toF. (This would perhaps have made sense ifFwas explicitly annotated within out T.)