// @target: es2015 // @strict: true // Test that callback parameters are related covariantly interface P { then(cb: (value: T) => void): void; }; interface A { a: string } interface B extends A { b: string } function f1(a: P, b: P) { a = b; b = a; // Error } function f2(a: Promise, b: Promise) { a = b; b = a; // Error } interface AList1 { forEach(cb: (item: A) => void): void; } interface BList1 { forEach(cb: (item: B) => void): void; } function f11(a: AList1, b: BList1) { a = b; b = a; // Error } interface AList2 { forEach(cb: (item: A) => boolean): void; } interface BList2 { forEach(cb: (item: A) => void): void; } function f12(a: AList2, b: BList2) { a = b; b = a; // Error } interface AList3 { forEach(cb: (item: A) => void): void; } interface BList3 { forEach(cb: (item: A, context: any) => void): void; } function f13(a: AList3, b: BList3) { a = b; b = a; // Error } interface AList4 { forEach(cb: (item: A) => A): void; } interface BList4 { forEach(cb: (item: B) => B): void; } function f14(a: AList4, b: BList4) { a = b; b = a; // Error }