Microsoft/TypeScript
Ver no GitHubCovariant generic parameters fail unification
Open
#61.503 aberto em 28 de mar. de 2025
BugDomain: check: Type InferenceHelp Wanted
Métricas do repositório
- Stars
- (48.455 stars)
- Métricas de merge de PR
- (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)
Description
🔎 Search Terms
"contravariant", "unification"
🕗 Version & Regression Information
- This changed between versions 3.3.3 and 3.5.1
⏯ Playground Link
💻 Code
const contravariant = () => {
const combine = <Ctx>(_1: (c:Ctx) => null, _2: (c:Ctx) => null): () => Ctx => () => undefined as any;
const less_constrined = <C extends {length:number}>(c: C): null => null;
const more_constrined = <C extends {length:number, charCodeAt(_:number):number}>(c: C): null => null;
const test1 = combine(less_constrined, more_constrined);
const test2 = combine(more_constrined, less_constrined);
}
const covariant = () => {
const combine = <Ctx>(_1: () => Ctx, _2: () => Ctx): Ctx => undefined as any;
const less_constrined = <C extends {length:number}>(): C => undefined as any;
const more_constrined = <C extends {length:number, charCodeAt(_:number):number}>(): C => undefined as any;
const test1 = combine(less_constrined, more_constrined);
const test2 = combine(more_constrined, less_constrined);
}
🙁 Actual behavior
In the contravariant example the type is inferred from the first argument, so test1 fails to typecheck, despite both test1 and test2 sharing the same argument types, just reversed. This is also different from the covariant case where types are properly unified in both test1 and test2
🙂 Expected behavior
The behaviour for the covariant and contravariant case should match, so test1 should be inferred as
<C extends { length: number; charCodeAt(_: number): number; }>() => C
Additional information about the issue
No response