==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers4.ts (17 errors) ==== // members N and M of types S and T have the same name, same accessibility, same optionality, and N is not assignable M module OnlyDerived { class Base { foo: string; } class Derived extends Base { bar: string; } class Derived2 extends Base { baz: string; } class S { foo: Derived; } class T { foo: Derived2; } var s: S; var t: T; interface S2 { foo: Derived; } interface T2 { foo: Derived2; } var s2: S2; var t2: T2; var a: { foo: Derived; } var b: { foo: Derived2; } var a2 = { foo: new Derived() }; var b2 = { foo: new Derived2() }; s = t; // error ~ !!! Type 'T' is not assignable to type 'S': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. t = s; // error ~ !!! Type 'S' is not assignable to type 'T': !!! Types of property 'foo' are incompatible: !!! Type 'Derived' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Derived'. s = s2; // ok s = a2; // ok s2 = t2; // error ~~ !!! Type 'T2' is not assignable to type 'S2': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. t2 = s2; // error ~~ !!! Type 'S2' is not assignable to type 'T2': !!! Types of property 'foo' are incompatible: !!! Type 'Derived' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Derived'. s2 = t; // error ~~ !!! Type 'T' is not assignable to type 'S2': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. s2 = b; // error ~~ !!! Type '{ foo: Derived2; }' is not assignable to type 'S2': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. s2 = a2; // ok a = b; // error ~ !!! Type '{ foo: Derived2; }' is not assignable to type '{ foo: Derived; }': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. b = a; // error ~ !!! Type '{ foo: Derived; }' is not assignable to type '{ foo: Derived2; }': !!! Types of property 'foo' are incompatible: !!! Type 'Derived' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Derived'. a = s; // ok a = s2; // ok a = a2; // ok a2 = b2; // error ~~ !!! Type '{ foo: Derived2; }' is not assignable to type '{ foo: Derived; }': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. b2 = a2; // error ~~ !!! Type '{ foo: Derived; }' is not assignable to type '{ foo: Derived2; }': !!! Types of property 'foo' are incompatible: !!! Type 'Derived' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Derived'. a2 = b; // error ~~ !!! Type '{ foo: Derived2; }' is not assignable to type '{ foo: Derived; }': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. a2 = t2; // error ~~ !!! Type 'T2' is not assignable to type '{ foo: Derived; }': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. a2 = t; // error ~~ !!! Type 'T' is not assignable to type '{ foo: Derived; }': !!! Types of property 'foo' are incompatible: !!! Type 'Derived2' is not assignable to type 'Derived': !!! Property 'bar' is missing in type 'Derived2'. } module WithBase { class Base { foo: string; } class Derived extends Base { bar: string; } class Derived2 extends Base { baz: string; } class S { foo: Base; } class T { foo: Derived2; } var s: S; var t: T; interface S2 { foo: Base; } interface T2 { foo: Derived2; } var s2: S2; var t2: T2; var a: { foo: Base; } var b: { foo: Derived2; } var a2 = { foo: new Base() }; var b2 = { foo: new Derived2() }; s = t; // ok t = s; // error ~ !!! Type 'S' is not assignable to type 'T': !!! Types of property 'foo' are incompatible: !!! Type 'Base' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Base'. s = s2; // ok s = a2; // ok s2 = t2; // ok t2 = s2; // error ~~ !!! Type 'S2' is not assignable to type 'T2': !!! Types of property 'foo' are incompatible: !!! Type 'Base' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Base'. s2 = t; // ok s2 = b; // ok s2 = a2; // ok a = b; // ok b = a; // error ~ !!! Type '{ foo: Base; }' is not assignable to type '{ foo: Derived2; }': !!! Types of property 'foo' are incompatible: !!! Type 'Base' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Base'. a = s; // ok a = s2; // ok a = a2; // ok a2 = b2; // ok b2 = a2; // error ~~ !!! Type '{ foo: Base; }' is not assignable to type '{ foo: Derived2; }': !!! Types of property 'foo' are incompatible: !!! Type 'Base' is not assignable to type 'Derived2': !!! Property 'baz' is missing in type 'Base'. a2 = b; // ok a2 = t2; // ok a2 = t; // ok }