TypeScript/tests/baselines/reference/objectTypeWithRecursiveWrappedPropertyCheckedNominally.errors.txt
2014-07-12 17:30:19 -07:00

75 lines
2.4 KiB
Plaintext

==== tests/cases/conformance/types/typeRelationships/recursiveTypes/objectTypeWithRecursiveWrappedPropertyCheckedNominally.ts (9 errors) ====
// Types with infinitely expanding recursive types are type checked nominally
class List<T> {
data: T;
next: List<List<T>>;
}
class MyList<T> {
data: T;
next: MyList<MyList<T>>;
}
var list1 = new List<number>();
var list2 = new List<string>();
var myList1 = new MyList<number>();
var myList2 = new MyList<string>();
list1 = myList1; // error, not nominally equal
list1 = myList2; // error, type mismatch
~~~~~
!!! Type 'MyList<string>' is not assignable to type 'List<number>':
!!! Types of property 'data' are incompatible:
!!! Type 'string' is not assignable to type 'number'.
list2 = myList1; // error, not nominally equal
~~~~~
!!! Type 'MyList<number>' is not assignable to type 'List<string>':
!!! Types of property 'data' are incompatible:
!!! Type 'number' is not assignable to type 'string'.
list2 = myList2; // error, type mismatch
var rList1 = new List<List<number>>();
var rMyList1 = new List<MyList<number>>();
rList1 = rMyList1; // error, not nominally equal
function foo<T extends List<number>, U extends MyList<number>>(t: T, u: U) {
t = u; // error
~
!!! Type 'U' is not assignable to type 'T'.
u = t; // error
~
!!! Type 'T' is not assignable to type 'U'.
var a: List<number>;
var b: MyList<number>;
a = t; // ok
a = u; // error
b = t; // error
b = u; // ok
}
function foo2<T extends U, U extends MyList<number>>(t: T, u: U) {
~~~~~~~~~~~
!!! Constraint of a type parameter cannot reference any type parameter from the same type parameter list.
t = u; // error
~
!!! Type 'U' is not assignable to type 'T'.
u = t; // was error, ok after constraint made illegal, doesn't matter
~
!!! Type 'T' is not assignable to type 'U'.
var a: List<number>;
var b: MyList<number>;
a = t; // error
~
!!! Type 'T' is not assignable to type 'List<number>'.
a = u; // error
b = t; // ok
~
!!! Type 'T' is not assignable to type 'MyList<number>'.
b = u; // ok
}