mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-07-08 14:28:19 -05:00
Tests for assignment compatibility of union types
• A union type U is assignable to a type T if each type in U is assignable to T. • A type T is assignable to a union type U if T is assignable to any type in U.
This commit is contained in:
154
tests/baselines/reference/unionTypesAssignability.errors.txt
Normal file
154
tests/baselines/reference/unionTypesAssignability.errors.txt
Normal file
@@ -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, U>(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'.
|
||||
}
|
||||
|
||||
165
tests/baselines/reference/unionTypesAssignability.js
Normal file
165
tests/baselines/reference/unionTypesAssignability.js
Normal file
@@ -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, U>(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
|
||||
}
|
||||
@@ -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, U>(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
|
||||
}
|
||||
Reference in New Issue
Block a user