-
Notifications
You must be signed in to change notification settings - Fork 12.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
11543d7
commit 50f84b1
Showing
3 changed files
with
246 additions
and
0 deletions.
There are no files selected for viewing
105 changes: 105 additions & 0 deletions
105
tests/baselines/reference/covariantCallbacks.errors.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(12,5): error TS2322: Type 'P<A>' is not assignable to type 'P<B>'. | ||
Type 'A' is not assignable to type 'B'. | ||
Property 'b' is missing in type 'A'. | ||
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(17,5): error TS2322: Type 'Promise<A>' is not assignable to type 'Promise<B>'. | ||
Type 'A' is not assignable to type 'B'. | ||
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(30,5): error TS2322: Type 'AList1' is not assignable to type 'BList1'. | ||
Types of property 'forEach' are incompatible. | ||
Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: B) => void) => void'. | ||
Types of parameters 'cb' and 'cb' are incompatible. | ||
Types of parameters 'item' and 'item' are incompatible. | ||
Type 'A' is not assignable to type 'B'. | ||
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(43,5): error TS2322: Type 'AList2' is not assignable to type 'BList2'. | ||
Types of property 'forEach' are incompatible. | ||
Type '(cb: (item: A) => boolean) => void' is not assignable to type '(cb: (item: A) => void) => void'. | ||
Types of parameters 'cb' and 'cb' are incompatible. | ||
Type 'void' is not assignable to type 'boolean'. | ||
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(56,5): error TS2322: Type 'AList3' is not assignable to type 'BList3'. | ||
Types of property 'forEach' are incompatible. | ||
Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. | ||
Types of parameters 'cb' and 'cb' are incompatible. | ||
|
||
|
||
==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts (5 errors) ==== | ||
// Test that callback parameters are related covariantly | ||
|
||
interface P<T> { | ||
then(cb: (value: T) => void): void; | ||
}; | ||
|
||
interface A { a: string } | ||
interface B extends A { b: string } | ||
|
||
function f1(a: P<A>, b: P<B>) { | ||
a = b; | ||
b = a; // Error | ||
~ | ||
!!! error TS2322: Type 'P<A>' is not assignable to type 'P<B>'. | ||
!!! error TS2322: Type 'A' is not assignable to type 'B'. | ||
!!! error TS2322: Property 'b' is missing in type 'A'. | ||
} | ||
|
||
function f2(a: Promise<A>, b: Promise<B>) { | ||
a = b; | ||
b = a; // Error | ||
~ | ||
!!! error TS2322: Type 'Promise<A>' is not assignable to type 'Promise<B>'. | ||
!!! error TS2322: Type 'A' is not assignable to type 'B'. | ||
} | ||
|
||
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 | ||
~ | ||
!!! error TS2322: Type 'AList1' is not assignable to type 'BList1'. | ||
!!! error TS2322: Types of property 'forEach' are incompatible. | ||
!!! error TS2322: Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: B) => void) => void'. | ||
!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. | ||
!!! error TS2322: Types of parameters 'item' and 'item' are incompatible. | ||
!!! error TS2322: Type 'A' is not assignable to type 'B'. | ||
} | ||
|
||
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 | ||
~ | ||
!!! error TS2322: Type 'AList2' is not assignable to type 'BList2'. | ||
!!! error TS2322: Types of property 'forEach' are incompatible. | ||
!!! error TS2322: Type '(cb: (item: A) => boolean) => void' is not assignable to type '(cb: (item: A) => void) => void'. | ||
!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. | ||
!!! error TS2322: Type 'void' is not assignable to type 'boolean'. | ||
} | ||
|
||
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 | ||
~ | ||
!!! error TS2322: Type 'AList3' is not assignable to type 'BList3'. | ||
!!! error TS2322: Types of property 'forEach' are incompatible. | ||
!!! error TS2322: Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. | ||
!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
//// [covariantCallbacks.ts] | ||
// Test that callback parameters are related covariantly | ||
|
||
interface P<T> { | ||
then(cb: (value: T) => void): void; | ||
}; | ||
|
||
interface A { a: string } | ||
interface B extends A { b: string } | ||
|
||
function f1(a: P<A>, b: P<B>) { | ||
a = b; | ||
b = a; // Error | ||
} | ||
|
||
function f2(a: Promise<A>, b: Promise<B>) { | ||
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 | ||
} | ||
|
||
//// [covariantCallbacks.js] | ||
// Test that callback parameters are related covariantly | ||
; | ||
function f1(a, b) { | ||
a = b; | ||
b = a; // Error | ||
} | ||
function f2(a, b) { | ||
a = b; | ||
b = a; // Error | ||
} | ||
function f11(a, b) { | ||
a = b; | ||
b = a; // Error | ||
} | ||
function f12(a, b) { | ||
a = b; | ||
b = a; // Error | ||
} | ||
function f13(a, b) { | ||
a = b; | ||
b = a; // Error | ||
} |
59 changes: 59 additions & 0 deletions
59
...s/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// @target: es2015 | ||
|
||
// Test that callback parameters are related covariantly | ||
|
||
interface P<T> { | ||
then(cb: (value: T) => void): void; | ||
}; | ||
|
||
interface A { a: string } | ||
interface B extends A { b: string } | ||
|
||
function f1(a: P<A>, b: P<B>) { | ||
a = b; | ||
b = a; // Error | ||
} | ||
|
||
function f2(a: Promise<A>, b: Promise<B>) { | ||
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 | ||
} |