==== tests/cases/conformance/types/typeRelationships/recursiveTypes/objectTypeWithRecursiveWrappedPropertyCheckedNominally.ts (9 errors) ==== // Types with infinitely expanding recursive types are type checked nominally class List { data: T; next: List>; } class MyList { data: T; next: MyList>; } var list1 = new List(); var list2 = new List(); var myList1 = new MyList(); var myList2 = new MyList(); list1 = myList1; // error, not nominally equal list1 = myList2; // error, type mismatch ~~~~~ !!! Type 'MyList' is not assignable to type 'List': !!! Types of property 'data' are incompatible: !!! Type 'string' is not assignable to type 'number'. list2 = myList1; // error, not nominally equal ~~~~~ !!! Type 'MyList' is not assignable to type 'List': !!! Types of property 'data' are incompatible: !!! Type 'number' is not assignable to type 'string'. list2 = myList2; // error, type mismatch var rList1 = new List>(); var rMyList1 = new List>(); rList1 = rMyList1; // error, not nominally equal function foo, U extends MyList>(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; var b: MyList; a = t; // ok a = u; // error b = t; // error b = u; // ok } function foo2>(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; var b: MyList; a = t; // error ~ !!! Type 'T' is not assignable to type 'List'. a = u; // error b = t; // ok ~ !!! Type 'T' is not assignable to type 'MyList'. b = u; // ok }