diff --git a/tests/baselines/reference/unionTypesAssignability.errors.txt b/tests/baselines/reference/unionTypesAssignability.errors.txt new file mode 100644 index 00000000000..b32f71a38c1 --- /dev/null +++ b/tests/baselines/reference/unionTypesAssignability.errors.txt @@ -0,0 +1,154 @@ +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(18,1): error TS2323: Type 'E' is not assignable to type 'D'. + Property 'foo1' is missing in type 'E'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(19,1): error TS2323: Type 'D | E' is not assignable to type 'D'. + Type 'E' is not assignable to type 'D'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(20,1): error TS2323: Type 'D' is not assignable to type 'E'. + Property 'foo2' is missing in type 'D'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(22,1): error TS2323: Type 'D | E' is not assignable to type 'E'. + Type 'D' is not assignable to type 'E'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(24,1): error TS2323: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(25,1): error TS2323: Type 'string | number' is not assignable to type 'number'. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(26,1): error TS2323: Type 'number' is not assignable to type 'string'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(28,1): error TS2323: Type 'string | number' is not assignable to type 'string'. + Type 'number' is not assignable to type 'string'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(31,1): error TS2323: Type 'C' is not assignable to type 'D'. + Property 'foo1' is missing in type 'C'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(32,1): error TS2323: Type 'C' is not assignable to type 'E'. + Property 'foo2' is missing in type 'C'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(33,1): error TS2323: Type 'C' is not assignable to type 'D | E'. + Type 'C' is not assignable to type 'E'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(35,1): error TS2323: Type 'D' is not assignable to type 'E'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(37,1): error TS2323: Type 'E' is not assignable to type 'D'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(41,1): error TS2323: Type 'number' is not assignable to type 'string'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(43,1): error TS2323: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(64,5): error TS2323: Type 'U' is not assignable to type 'T'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(65,5): error TS2323: Type 'T' is not assignable to type 'U'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(69,5): error TS2323: Type 'T | U' is not assignable to type 'T'. + Type 'U' is not assignable to type 'T'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(70,5): error TS2323: Type 'T | U' is not assignable to type 'U'. + Type 'T' is not assignable to type 'U'. + + +==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts (19 errors) ==== + var unionNumberString: number | string; + class C { } + class D extends C { foo1() { } } + class E extends C { foo2() { } } + var unionDE: D | E; + + var num: number; + var str: string; + var c: C; + var d: D; + var e: E; + + // A union type U is assignable to a type T if each type in U is assignable to T + c = d; + c = e; + c = unionDE; // ok + d = d; + d = e; + ~ +!!! error TS2323: Type 'E' is not assignable to type 'D'. +!!! error TS2323: Property 'foo1' is missing in type 'E'. + d = unionDE; // error e is not assignable to d + ~ +!!! error TS2323: Type 'D | E' is not assignable to type 'D'. +!!! error TS2323: Type 'E' is not assignable to type 'D'. + e = d; + ~ +!!! error TS2323: Type 'D' is not assignable to type 'E'. +!!! error TS2323: Property 'foo2' is missing in type 'D'. + e = e; + e = unionDE; // error d is not assignable to e + ~ +!!! error TS2323: Type 'D | E' is not assignable to type 'E'. +!!! error TS2323: Type 'D' is not assignable to type 'E'. + num = num; + num = str; + ~~~ +!!! error TS2323: Type 'string' is not assignable to type 'number'. + num = unionNumberString; // error string is not assignable to number + ~~~ +!!! error TS2323: Type 'string | number' is not assignable to type 'number'. +!!! error TS2323: Type 'string' is not assignable to type 'number'. + str = num; + ~~~ +!!! error TS2323: Type 'number' is not assignable to type 'string'. + str = str; + str = unionNumberString; // error since number is not assignable to string + ~~~ +!!! error TS2323: Type 'string | number' is not assignable to type 'string'. +!!! error TS2323: Type 'number' is not assignable to type 'string'. + + // A type T is assignable to a union type U if T is assignable to any type in U + d = c; + ~ +!!! error TS2323: Type 'C' is not assignable to type 'D'. +!!! error TS2323: Property 'foo1' is missing in type 'C'. + e = c; + ~ +!!! error TS2323: Type 'C' is not assignable to type 'E'. +!!! error TS2323: Property 'foo2' is missing in type 'C'. + unionDE = c; // error since C is not assinable to either D or E + ~~~~~~~ +!!! error TS2323: Type 'C' is not assignable to type 'D | E'. +!!! error TS2323: Type 'C' is not assignable to type 'E'. + d = d; + e = d; + ~ +!!! error TS2323: Type 'D' is not assignable to type 'E'. + unionDE = d; // ok + d = e; + ~ +!!! error TS2323: Type 'E' is not assignable to type 'D'. + e = e; + unionDE = e; // ok + num = num; + str = num; + ~~~ +!!! error TS2323: Type 'number' is not assignable to type 'string'. + unionNumberString = num; // ok + num = str; + ~~~ +!!! error TS2323: Type 'string' is not assignable to type 'number'. + str = str; + unionNumberString = str; // ok + + // Any + var anyVar: any; + anyVar = unionDE; + anyVar = unionNumberString; + unionDE = anyVar; + unionNumberString = anyVar; + + // null + unionDE = null; + unionNumberString = null; + + // undefined + unionDE = undefined; + unionNumberString = undefined; + + // type parameters + function foo(t: T, u: U) { + t = u; // error + ~ +!!! error TS2323: Type 'U' is not assignable to type 'T'. + u = t; // error + ~ +!!! error TS2323: Type 'T' is not assignable to type 'U'. + var x : T | U; + x = t; // ok + x = u; // ok + t = x; // error U not assignable to T + ~ +!!! error TS2323: Type 'T | U' is not assignable to type 'T'. +!!! error TS2323: Type 'U' is not assignable to type 'T'. + u = x; // error T not assignable to U + ~ +!!! error TS2323: Type 'T | U' is not assignable to type 'U'. +!!! error TS2323: Type 'T' is not assignable to type 'U'. + } + \ No newline at end of file diff --git a/tests/baselines/reference/unionTypesAssignability.js b/tests/baselines/reference/unionTypesAssignability.js new file mode 100644 index 00000000000..a67f23bb09f --- /dev/null +++ b/tests/baselines/reference/unionTypesAssignability.js @@ -0,0 +1,165 @@ +//// [unionTypesAssignability.ts] +var unionNumberString: number | string; +class C { } +class D extends C { foo1() { } } +class E extends C { foo2() { } } +var unionDE: D | E; + +var num: number; +var str: string; +var c: C; +var d: D; +var e: E; + +// A union type U is assignable to a type T if each type in U is assignable to T +c = d; +c = e; +c = unionDE; // ok +d = d; +d = e; +d = unionDE; // error e is not assignable to d +e = d; +e = e; +e = unionDE; // error d is not assignable to e +num = num; +num = str; +num = unionNumberString; // error string is not assignable to number +str = num; +str = str; +str = unionNumberString; // error since number is not assignable to string + +// A type T is assignable to a union type U if T is assignable to any type in U +d = c; +e = c; +unionDE = c; // error since C is not assinable to either D or E +d = d; +e = d; +unionDE = d; // ok +d = e; +e = e; +unionDE = e; // ok +num = num; +str = num; +unionNumberString = num; // ok +num = str; +str = str; +unionNumberString = str; // ok + +// Any +var anyVar: any; +anyVar = unionDE; +anyVar = unionNumberString; +unionDE = anyVar; +unionNumberString = anyVar; + +// null +unionDE = null; +unionNumberString = null; + +// undefined +unionDE = undefined; +unionNumberString = undefined; + +// type parameters +function foo(t: T, u: U) { + t = u; // error + u = t; // error + var x : T | U; + x = t; // ok + x = u; // ok + t = x; // error U not assignable to T + u = x; // error T not assignable to U +} + + +//// [unionTypesAssignability.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var unionNumberString; +var C = (function () { + function C() { + } + return C; +})(); +var D = (function (_super) { + __extends(D, _super); + function D() { + _super.apply(this, arguments); + } + D.prototype.foo1 = function () { + }; + return D; +})(C); +var E = (function (_super) { + __extends(E, _super); + function E() { + _super.apply(this, arguments); + } + E.prototype.foo2 = function () { + }; + return E; +})(C); +var unionDE; +var num; +var str; +var c; +var d; +var e; +// A union type U is assignable to a type T if each type in U is assignable to T +c = d; +c = e; +c = unionDE; // ok +d = d; +d = e; +d = unionDE; // error e is not assignable to d +e = d; +e = e; +e = unionDE; // error d is not assignable to e +num = num; +num = str; +num = unionNumberString; // error string is not assignable to number +str = num; +str = str; +str = unionNumberString; // error since number is not assignable to string +// A type T is assignable to a union type U if T is assignable to any type in U +d = c; +e = c; +unionDE = c; // error since C is not assinable to either D or E +d = d; +e = d; +unionDE = d; // ok +d = e; +e = e; +unionDE = e; // ok +num = num; +str = num; +unionNumberString = num; // ok +num = str; +str = str; +unionNumberString = str; // ok +// Any +var anyVar; +anyVar = unionDE; +anyVar = unionNumberString; +unionDE = anyVar; +unionNumberString = anyVar; +// null +unionDE = null; +unionNumberString = null; +// undefined +unionDE = undefined; +unionNumberString = undefined; +// type parameters +function foo(t, u) { + t = u; // error + u = t; // error + var x; + x = t; // ok + x = u; // ok + t = x; // error U not assignable to T + u = x; // error T not assignable to U +} diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts new file mode 100644 index 00000000000..9ceee8845a5 --- /dev/null +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts @@ -0,0 +1,71 @@ +var unionNumberString: number | string; +class C { } +class D extends C { foo1() { } } +class E extends C { foo2() { } } +var unionDE: D | E; + +var num: number; +var str: string; +var c: C; +var d: D; +var e: E; + +// A union type U is assignable to a type T if each type in U is assignable to T +c = d; +c = e; +c = unionDE; // ok +d = d; +d = e; +d = unionDE; // error e is not assignable to d +e = d; +e = e; +e = unionDE; // error d is not assignable to e +num = num; +num = str; +num = unionNumberString; // error string is not assignable to number +str = num; +str = str; +str = unionNumberString; // error since number is not assignable to string + +// A type T is assignable to a union type U if T is assignable to any type in U +d = c; +e = c; +unionDE = c; // error since C is not assinable to either D or E +d = d; +e = d; +unionDE = d; // ok +d = e; +e = e; +unionDE = e; // ok +num = num; +str = num; +unionNumberString = num; // ok +num = str; +str = str; +unionNumberString = str; // ok + +// Any +var anyVar: any; +anyVar = unionDE; +anyVar = unionNumberString; +unionDE = anyVar; +unionNumberString = anyVar; + +// null +unionDE = null; +unionNumberString = null; + +// undefined +unionDE = undefined; +unionNumberString = undefined; + +// type parameters +function foo(t: T, u: U) { + t = u; // error + u = t; // error + var x : T | U; + x = t; // ok + x = u; // ok + t = x; // error U not assignable to T + u = x; // error T not assignable to U +}