// @strict: true // The type below should be invariant in T but is measured as covariant because // we don't analyze recursive references. interface Foo1 { x: T; y: Foo1<(arg: T) => void>; } declare const f10: Foo1; const f11: Foo1<'a'> = f10; const f12: Foo1 = f10; // The type below is invariant in T and is measured as such. interface Foo2 { x: T; y: { x: (arg: T) => void, y: Foo2<(arg: T) => void>; } } declare const f20: Foo2; const f21: Foo2<'a'> = f20; const f22: Foo2 = f20; // The type below should be invariant in T but is measured as covariant because // we don't analyze recursive references. type Foo3 = { x: T; y: Foo3<(arg: T) => void>; } declare const f30: Foo3; const f31: Foo3<'a'> = f30; const f32: Foo3 = f30; // The type below is invariant in T and is measured as such. type Foo4 = { x: T; y: { x: (arg: T) => void, y: Foo4<(arg: T) => void>; } } declare const f40: Foo4; const f41: Foo4<'a'> = f40; const f42: Foo4 = f40; // Repro from #3580 interface Fn { (a: A): B; then(next: Fn): Fn; } declare const fn: Fn; // Contravariant in A const fn1: Fn = fn; // Error const fn2: Fn<'a', number> = fn; // Covariant in B const fn3: Fn = fn; const fn4: Fn = fn; // Error // Repro from #39947 interface I { c: C; } class C { declare sub: I; declare covariance: V; } const c1: C = new C(); // Error