Merge pull request #1056 from Microsoft/unionTypeConformance

Union type conformance
This commit is contained in:
Sheetal Nandi
2014-12-02 08:02:34 -08:00
69 changed files with 3954 additions and 210 deletions
@@ -2,19 +2,19 @@ tests/cases/conformance/types/tuple/castingTuple.ts(13,23): error TS2352: Neithe
Property '2' is missing in type '[number, string]'.
tests/cases/conformance/types/tuple/castingTuple.ts(16,21): error TS2352: Neither type '[C, D]' nor type '[C, D, A]' is assignable to the other.
Property '2' is missing in type '[C, D]'.
tests/cases/conformance/types/tuple/castingTuple.ts(24,10): error TS2352: Neither type '[number, string]' nor type '[number, number]' is assignable to the other.
tests/cases/conformance/types/tuple/castingTuple.ts(28,10): error TS2352: Neither type '[number, string]' nor type '[number, number]' is assignable to the other.
Types of property '1' are incompatible.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/castingTuple.ts(25,10): error TS2352: Neither type '[C, D]' nor type '[A, I]' is assignable to the other.
tests/cases/conformance/types/tuple/castingTuple.ts(29,10): error TS2352: Neither type '[C, D]' nor type '[A, I]' is assignable to the other.
Types of property '0' are incompatible.
Type 'C' is not assignable to type 'A'.
tests/cases/conformance/types/tuple/castingTuple.ts(26,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'array1' must be of type '{}[]', but here has type 'number[]'.
tests/cases/conformance/types/tuple/castingTuple.ts(26,14): error TS2352: Neither type '[number, string]' nor type 'number[]' is assignable to the other.
tests/cases/conformance/types/tuple/castingTuple.ts(30,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'array1' must be of type '{}[]', but here has type 'number[]'.
tests/cases/conformance/types/tuple/castingTuple.ts(30,14): error TS2352: Neither type '[number, string]' nor type 'number[]' is assignable to the other.
Types of property 'pop' are incompatible.
Type '() => string | number' is not assignable to type '() => number'.
Type 'string | number' is not assignable to type 'number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/castingTuple.ts(27,1): error TS2304: Cannot find name 't4'.
tests/cases/conformance/types/tuple/castingTuple.ts(31,1): error TS2304: Cannot find name 't4'.
==== tests/cases/conformance/types/tuple/castingTuple.ts (7 errors) ====
@@ -41,10 +41,14 @@ tests/cases/conformance/types/tuple/castingTuple.ts(27,1): error TS2304: Cannot
!!! error TS2352: Neither type '[C, D]' nor type '[C, D, A]' is assignable to the other.
!!! error TS2352: Property '2' is missing in type '[C, D]'.
var eleFromCDA1 = classCDATuple[2]; // A
var eleFromCDA2 = classCDATuple[5]; // {}
var eleFromCDA2 = classCDATuple[5]; // C | D | A
var t10: [E1, E2] = [E1.one, E2.one];
var t11 = <[number, number]>t10;
var array1 = <{}[]>emptyObjTuple;
var unionTuple: [C, string | number] = [new C(), "foo"];
var unionTuple2: [C, string | number, D] = [new C(), "foo", new D()];
var unionTuple3: [number, string| number] = [10, "foo"];
var unionTuple4 = <[number, number]>unionTuple3;
// error
var t3 = <[number, number]>numStrTuple;
@@ -68,4 +72,5 @@ tests/cases/conformance/types/tuple/castingTuple.ts(27,1): error TS2304: Cannot
!!! error TS2352: Type 'string' is not assignable to type 'number'.
t4[2] = 10;
~~
!!! error TS2304: Cannot find name 't4'.
!!! error TS2304: Cannot find name 't4'.
+12 -3
View File
@@ -16,16 +16,21 @@ var classCDTuple: [C, D] = [new C(), new D()];
var interfaceIITuple = <[I, I]>classCDTuple;
var classCDATuple = <[C, D, A]>classCDTuple;
var eleFromCDA1 = classCDATuple[2]; // A
var eleFromCDA2 = classCDATuple[5]; // {}
var eleFromCDA2 = classCDATuple[5]; // C | D | A
var t10: [E1, E2] = [E1.one, E2.one];
var t11 = <[number, number]>t10;
var array1 = <{}[]>emptyObjTuple;
var unionTuple: [C, string | number] = [new C(), "foo"];
var unionTuple2: [C, string | number, D] = [new C(), "foo", new D()];
var unionTuple3: [number, string| number] = [10, "foo"];
var unionTuple4 = <[number, number]>unionTuple3;
// error
var t3 = <[number, number]>numStrTuple;
var t9 = <[A, I]>classCDTuple;
var array1 = <number[]>numStrTuple;
t4[2] = 10;
t4[2] = 10;
//// [castingTuple.js]
var __extends = this.__extends || function (d, b) {
@@ -84,10 +89,14 @@ var classCDTuple = [new C(), new D()];
var interfaceIITuple = classCDTuple;
var classCDATuple = classCDTuple;
var eleFromCDA1 = classCDATuple[2]; // A
var eleFromCDA2 = classCDATuple[5]; // {}
var eleFromCDA2 = classCDATuple[5]; // C | D | A
var t10 = [0 /* one */, 0 /* one */];
var t11 = t10;
var array1 = emptyObjTuple;
var unionTuple = [new C(), "foo"];
var unionTuple2 = [new C(), "foo", new D()];
var unionTuple3 = [10, "foo"];
var unionTuple4 = unionTuple3;
// error
var t3 = numStrTuple;
var t9 = classCDTuple;
@@ -20,6 +20,7 @@ condBoolean ? exprBoolean1 : exprBoolean2;
condBoolean ? exprNumber1 : exprNumber2;
condBoolean ? exprString1 : exprString2;
condBoolean ? exprIsObject1 : exprIsObject2;
condBoolean ? exprString1 : exprBoolean1; // union
//Cond is a boolean type literal
true ? exprAny1 : exprAny2;
@@ -27,6 +28,7 @@ false ? exprBoolean1 : exprBoolean2;
true ? exprNumber1 : exprNumber2;
false ? exprString1 : exprString2;
true ? exprIsObject1 : exprIsObject2;
true ? exprString1 : exprBoolean1; // union
//Cond is a boolean type expression
!true ? exprAny1 : exprAny2;
@@ -34,6 +36,7 @@ typeof "123" == "string" ? exprBoolean1 : exprBoolean2;
2 > 1 ? exprNumber1 : exprNumber2;
null === undefined ? exprString1 : exprString2;
true || false ? exprIsObject1 : exprIsObject2;
null === undefined ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condBoolean ? exprAny1 : exprAny2;
@@ -41,18 +44,22 @@ var resultIsBoolean1 = condBoolean ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condBoolean ? exprNumber1 : exprNumber2;
var resultIsString1 = condBoolean ? exprString1 : exprString2;
var resultIsObject1 = condBoolean ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condBoolean ? exprString1 : exprBoolean1; // union
var resultIsAny2 = true ? exprAny1 : exprAny2;
var resultIsBoolean2 = false ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = true ? exprNumber1 : exprNumber2;
var resultIsString2 = false ? exprString1 : exprString2;
var resultIsObject2 = true ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = true ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean3 = false ? exprString1 : exprBoolean1; // union
var resultIsAny3 = !true ? exprAny1 : exprAny2;
var resultIsBoolean3 = typeof "123" == "string" ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = 2 > 1 ? exprNumber1 : exprNumber2;
var resultIsString3 = null === undefined ? exprString1 : exprString2;
var resultIsObject3 = true || false ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean4 = typeof "123" === "string" ? exprString1 : exprBoolean1; // union
//// [conditionalOperatorConditionIsBooleanType.js]
@@ -74,31 +81,38 @@ condBoolean ? exprBoolean1 : exprBoolean2;
condBoolean ? exprNumber1 : exprNumber2;
condBoolean ? exprString1 : exprString2;
condBoolean ? exprIsObject1 : exprIsObject2;
condBoolean ? exprString1 : exprBoolean1; // union
//Cond is a boolean type literal
true ? exprAny1 : exprAny2;
false ? exprBoolean1 : exprBoolean2;
true ? exprNumber1 : exprNumber2;
false ? exprString1 : exprString2;
true ? exprIsObject1 : exprIsObject2;
true ? exprString1 : exprBoolean1; // union
//Cond is a boolean type expression
!true ? exprAny1 : exprAny2;
typeof "123" == "string" ? exprBoolean1 : exprBoolean2;
2 > 1 ? exprNumber1 : exprNumber2;
null === undefined ? exprString1 : exprString2;
true || false ? exprIsObject1 : exprIsObject2;
null === undefined ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condBoolean ? exprAny1 : exprAny2;
var resultIsBoolean1 = condBoolean ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condBoolean ? exprNumber1 : exprNumber2;
var resultIsString1 = condBoolean ? exprString1 : exprString2;
var resultIsObject1 = condBoolean ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condBoolean ? exprString1 : exprBoolean1; // union
var resultIsAny2 = true ? exprAny1 : exprAny2;
var resultIsBoolean2 = false ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = true ? exprNumber1 : exprNumber2;
var resultIsString2 = false ? exprString1 : exprString2;
var resultIsObject2 = true ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = true ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean3 = false ? exprString1 : exprBoolean1; // union
var resultIsAny3 = !true ? exprAny1 : exprAny2;
var resultIsBoolean3 = typeof "123" == "string" ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = 2 > 1 ? exprNumber1 : exprNumber2;
var resultIsString3 = null === undefined ? exprString1 : exprString2;
var resultIsObject3 = true || false ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean4 = typeof "123" === "string" ? exprString1 : exprBoolean1; // union
@@ -66,6 +66,12 @@ condBoolean ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
condBoolean ? exprString1 : exprBoolean1; // union
>condBoolean ? exprString1 : exprBoolean1 : string | boolean
>condBoolean : boolean
>exprString1 : string
>exprBoolean1 : boolean
//Cond is a boolean type literal
true ? exprAny1 : exprAny2;
>true ? exprAny1 : exprAny2 : any
@@ -92,6 +98,11 @@ true ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
true ? exprString1 : exprBoolean1; // union
>true ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
//Cond is a boolean type expression
!true ? exprAny1 : exprAny2;
>!true ? exprAny1 : exprAny2 : any
@@ -125,6 +136,13 @@ true || false ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
null === undefined ? exprString1 : exprBoolean1; // union
>null === undefined ? exprString1 : exprBoolean1 : string | boolean
>null === undefined : boolean
>undefined : undefined
>exprString1 : string
>exprBoolean1 : boolean
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condBoolean ? exprAny1 : exprAny2;
>resultIsAny1 : any
@@ -161,6 +179,13 @@ var resultIsObject1 = condBoolean ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean1 = condBoolean ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean1 : string | boolean
>condBoolean ? exprString1 : exprBoolean1 : string | boolean
>condBoolean : boolean
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny2 = true ? exprAny1 : exprAny2;
>resultIsAny2 : any
>true ? exprAny1 : exprAny2 : any
@@ -191,6 +216,18 @@ var resultIsObject2 = true ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean2 = true ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean2 : string | boolean
>true ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
var resultIsStringOrBoolean3 = false ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean3 : string | boolean
>false ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny3 = !true ? exprAny1 : exprAny2;
>resultIsAny3 : any
>!true ? exprAny1 : exprAny2 : any
@@ -228,3 +265,11 @@ var resultIsObject3 = true || false ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean4 = typeof "123" === "string" ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean4 : string | boolean
>typeof "123" === "string" ? exprString1 : exprBoolean1 : string | boolean
>typeof "123" === "string" : boolean
>typeof "123" : string
>exprString1 : string
>exprBoolean1 : boolean
@@ -20,6 +20,7 @@ condNumber ? exprBoolean1 : exprBoolean2;
condNumber ? exprNumber1 : exprNumber2;
condNumber ? exprString1 : exprString2;
condNumber ? exprIsObject1 : exprIsObject2;
condNumber ? exprString1 : exprBoolean1; // Union
//Cond is a number type literal
1 ? exprAny1 : exprAny2;
@@ -27,6 +28,7 @@ condNumber ? exprIsObject1 : exprIsObject2;
0.123456789 ? exprNumber1 : exprNumber2;
- 10000000000000 ? exprString1 : exprString2;
1000000000000 ? exprIsObject1 : exprIsObject2;
10000 ? exprString1 : exprBoolean1; // Union
//Cond is a number type expression
function foo() { return 1 };
@@ -37,6 +39,7 @@ var array = [1, 2, 3];
"string".length ? exprNumber1 : exprNumber2;
foo() ? exprString1 : exprString2;
foo() / array[1] ? exprIsObject1 : exprIsObject2;
foo() ? exprString1 : exprBoolean1; // Union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condNumber ? exprAny1 : exprAny2;
@@ -44,19 +47,21 @@ var resultIsBoolean1 = condNumber ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condNumber ? exprNumber1 : exprNumber2;
var resultIsString1 = condNumber ? exprString1 : exprString2;
var resultIsObject1 = condNumber ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condNumber ? exprString1 : exprBoolean1; // Union
var resultIsAny2 = 1 ? exprAny1 : exprAny2;
var resultIsBoolean2 = 0 ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = 0.123456789 ? exprNumber1 : exprNumber2;
var resultIsString2 = - 10000000000000 ? exprString1 : exprString2;
var resultIsObject2 = 1000000000000 ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = 10000 ? exprString1 : exprBoolean1; // Union
var resultIsAny3 = 1 * 0 ? exprAny1 : exprAny2;
var resultIsBoolean3 = 1 + 1 ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = "string".length ? exprNumber1 : exprNumber2;
var resultIsString3 = foo() ? exprString1 : exprString2;
var resultIsObject3 = foo() / array[1] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = foo() / array[1] ? exprString1 : exprBoolean1; // Union
//// [conditionalOperatorConditionIsNumberType.js]
//Cond ? Expr1 : Expr2, Cond is of number type, Expr1 and Expr2 have the same type
@@ -77,12 +82,14 @@ condNumber ? exprBoolean1 : exprBoolean2;
condNumber ? exprNumber1 : exprNumber2;
condNumber ? exprString1 : exprString2;
condNumber ? exprIsObject1 : exprIsObject2;
condNumber ? exprString1 : exprBoolean1; // Union
//Cond is a number type literal
1 ? exprAny1 : exprAny2;
0 ? exprBoolean1 : exprBoolean2;
0.123456789 ? exprNumber1 : exprNumber2;
-10000000000000 ? exprString1 : exprString2;
1000000000000 ? exprIsObject1 : exprIsObject2;
10000 ? exprString1 : exprBoolean1; // Union
//Cond is a number type expression
function foo() {
return 1;
@@ -94,19 +101,23 @@ var array = [1, 2, 3];
"string".length ? exprNumber1 : exprNumber2;
foo() ? exprString1 : exprString2;
foo() / array[1] ? exprIsObject1 : exprIsObject2;
foo() ? exprString1 : exprBoolean1; // Union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condNumber ? exprAny1 : exprAny2;
var resultIsBoolean1 = condNumber ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condNumber ? exprNumber1 : exprNumber2;
var resultIsString1 = condNumber ? exprString1 : exprString2;
var resultIsObject1 = condNumber ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condNumber ? exprString1 : exprBoolean1; // Union
var resultIsAny2 = 1 ? exprAny1 : exprAny2;
var resultIsBoolean2 = 0 ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = 0.123456789 ? exprNumber1 : exprNumber2;
var resultIsString2 = -10000000000000 ? exprString1 : exprString2;
var resultIsObject2 = 1000000000000 ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = 10000 ? exprString1 : exprBoolean1; // Union
var resultIsAny3 = 1 * 0 ? exprAny1 : exprAny2;
var resultIsBoolean3 = 1 + 1 ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = "string".length ? exprNumber1 : exprNumber2;
var resultIsString3 = foo() ? exprString1 : exprString2;
var resultIsObject3 = foo() / array[1] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = foo() / array[1] ? exprString1 : exprBoolean1; // Union
@@ -66,6 +66,12 @@ condNumber ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
condNumber ? exprString1 : exprBoolean1; // Union
>condNumber ? exprString1 : exprBoolean1 : string | boolean
>condNumber : number
>exprString1 : string
>exprBoolean1 : boolean
//Cond is a number type literal
1 ? exprAny1 : exprAny2;
>1 ? exprAny1 : exprAny2 : any
@@ -93,6 +99,11 @@ condNumber ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
10000 ? exprString1 : exprBoolean1; // Union
>10000 ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
//Cond is a number type expression
function foo() { return 1 };
>foo : () => number
@@ -137,6 +148,13 @@ foo() / array[1] ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
foo() ? exprString1 : exprBoolean1; // Union
>foo() ? exprString1 : exprBoolean1 : string | boolean
>foo() : number
>foo : () => number
>exprString1 : string
>exprBoolean1 : boolean
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condNumber ? exprAny1 : exprAny2;
>resultIsAny1 : any
@@ -173,6 +191,13 @@ var resultIsObject1 = condNumber ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean1 = condNumber ? exprString1 : exprBoolean1; // Union
>resultIsStringOrBoolean1 : string | boolean
>condNumber ? exprString1 : exprBoolean1 : string | boolean
>condNumber : number
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny2 = 1 ? exprAny1 : exprAny2;
>resultIsAny2 : any
>1 ? exprAny1 : exprAny2 : any
@@ -204,6 +229,12 @@ var resultIsObject2 = 1000000000000 ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean2 = 10000 ? exprString1 : exprBoolean1; // Union
>resultIsStringOrBoolean2 : string | boolean
>10000 ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny3 = 1 * 0 ? exprAny1 : exprAny2;
>resultIsAny3 : any
>1 * 0 ? exprAny1 : exprAny2 : any
@@ -245,3 +276,14 @@ var resultIsObject3 = foo() / array[1] ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean3 = foo() / array[1] ? exprString1 : exprBoolean1; // Union
>resultIsStringOrBoolean3 : string | boolean
>foo() / array[1] ? exprString1 : exprBoolean1 : string | boolean
>foo() / array[1] : number
>foo() : number
>foo : () => number
>array[1] : number
>array : number[]
>exprString1 : string
>exprBoolean1 : boolean
@@ -23,6 +23,7 @@ condObject ? exprBoolean1 : exprBoolean2;
condObject ? exprNumber1 : exprNumber2;
condObject ? exprString1 : exprString2;
condObject ? exprIsObject1 : exprIsObject2;
condObject ? exprString1 : exprBoolean1; // union
//Cond is an object type literal
((a: string) => a.length) ? exprAny1 : exprAny2;
@@ -30,6 +31,7 @@ condObject ? exprIsObject1 : exprIsObject2;
({}) ? exprNumber1 : exprNumber2;
({ a: 1, b: "s" }) ? exprString1 : exprString2;
({ a: 1, b: "s" }) ? exprIsObject1 : exprIsObject2;
({ a: 1, b: "s" }) ? exprString1: exprBoolean1; // union
//Cond is an object type expression
foo() ? exprAny1 : exprAny2;
@@ -37,6 +39,7 @@ new Date() ? exprBoolean1 : exprBoolean2;
new C() ? exprNumber1 : exprNumber2;
C.doIt() ? exprString1 : exprString2;
condObject.valueOf() ? exprIsObject1 : exprIsObject2;
new Date() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condObject ? exprAny1 : exprAny2;
@@ -44,18 +47,21 @@ var resultIsBoolean1 = condObject ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condObject ? exprNumber1 : exprNumber2;
var resultIsString1 = condObject ? exprString1 : exprString2;
var resultIsObject1 = condObject ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condObject ? exprString1 : exprBoolean1; // union
var resultIsAny2 = ((a: string) => a.length) ? exprAny1 : exprAny2;
var resultIsBoolean2 = ((a: string) => a.length) ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = ({}) ? exprNumber1 : exprNumber2;
var resultIsString2 = ({ a: 1, b: "s" }) ? exprString1 : exprString2;
var resultIsObject2 = ({ a: 1, b: "s" }) ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = ({ a: 1, b: "s" }) ? exprString1 : exprBoolean1; // union
var resultIsAny3 = foo() ? exprAny1 : exprAny2;
var resultIsBoolean3 = new Date() ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = new C() ? exprNumber1 : exprNumber2;
var resultIsString3 = C.doIt() ? exprString1 : exprString2;
var resultIsObject3 = condObject.valueOf() ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = C.doIt() ? exprString1 : exprBoolean1; // union
//// [conditionalOperatorConditionIsObjectType.js]
@@ -86,31 +92,37 @@ condObject ? exprBoolean1 : exprBoolean2;
condObject ? exprNumber1 : exprNumber2;
condObject ? exprString1 : exprString2;
condObject ? exprIsObject1 : exprIsObject2;
condObject ? exprString1 : exprBoolean1; // union
//Cond is an object type literal
(function (a) { return a.length; }) ? exprAny1 : exprAny2;
(function (a) { return a.length; }) ? exprBoolean1 : exprBoolean2;
({}) ? exprNumber1 : exprNumber2;
({ a: 1, b: "s" }) ? exprString1 : exprString2;
({ a: 1, b: "s" }) ? exprIsObject1 : exprIsObject2;
({ a: 1, b: "s" }) ? exprString1 : exprBoolean1; // union
//Cond is an object type expression
foo() ? exprAny1 : exprAny2;
new Date() ? exprBoolean1 : exprBoolean2;
new C() ? exprNumber1 : exprNumber2;
C.doIt() ? exprString1 : exprString2;
condObject.valueOf() ? exprIsObject1 : exprIsObject2;
new Date() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condObject ? exprAny1 : exprAny2;
var resultIsBoolean1 = condObject ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condObject ? exprNumber1 : exprNumber2;
var resultIsString1 = condObject ? exprString1 : exprString2;
var resultIsObject1 = condObject ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condObject ? exprString1 : exprBoolean1; // union
var resultIsAny2 = (function (a) { return a.length; }) ? exprAny1 : exprAny2;
var resultIsBoolean2 = (function (a) { return a.length; }) ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = ({}) ? exprNumber1 : exprNumber2;
var resultIsString2 = ({ a: 1, b: "s" }) ? exprString1 : exprString2;
var resultIsObject2 = ({ a: 1, b: "s" }) ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = ({ a: 1, b: "s" }) ? exprString1 : exprBoolean1; // union
var resultIsAny3 = foo() ? exprAny1 : exprAny2;
var resultIsBoolean3 = new Date() ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = new C() ? exprNumber1 : exprNumber2;
var resultIsString3 = C.doIt() ? exprString1 : exprString2;
var resultIsObject3 = condObject.valueOf() ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = C.doIt() ? exprString1 : exprBoolean1; // union
@@ -74,6 +74,12 @@ condObject ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
condObject ? exprString1 : exprBoolean1; // union
>condObject ? exprString1 : exprBoolean1 : string | boolean
>condObject : Object
>exprString1 : string
>exprBoolean1 : boolean
//Cond is an object type literal
((a: string) => a.length) ? exprAny1 : exprAny2;
>((a: string) => a.length) ? exprAny1 : exprAny2 : any
@@ -122,6 +128,15 @@ condObject ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
({ a: 1, b: "s" }) ? exprString1: exprBoolean1; // union
>({ a: 1, b: "s" }) ? exprString1: exprBoolean1 : string | boolean
>({ a: 1, b: "s" }) : { a: number; b: string; }
>{ a: 1, b: "s" } : { a: number; b: string; }
>a : number
>b : string
>exprString1 : string
>exprBoolean1 : boolean
//Cond is an object type expression
foo() ? exprAny1 : exprAny2;
>foo() ? exprAny1 : exprAny2 : any
@@ -162,6 +177,13 @@ condObject.valueOf() ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
new Date() ? exprString1 : exprBoolean1; // union
>new Date() ? exprString1 : exprBoolean1 : string | boolean
>new Date() : Date
>Date : { (): string; new (): Date; new (value: number): Date; new (value: string): Date; new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date; prototype: Date; parse(s: string): number; UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number; now(): number; }
>exprString1 : string
>exprBoolean1 : boolean
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condObject ? exprAny1 : exprAny2;
>resultIsAny1 : any
@@ -198,6 +220,13 @@ var resultIsObject1 = condObject ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean1 = condObject ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean1 : string | boolean
>condObject ? exprString1 : exprBoolean1 : string | boolean
>condObject : Object
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny2 = ((a: string) => a.length) ? exprAny1 : exprAny2;
>resultIsAny2 : any
>((a: string) => a.length) ? exprAny1 : exprAny2 : any
@@ -250,6 +279,16 @@ var resultIsObject2 = ({ a: 1, b: "s" }) ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean2 = ({ a: 1, b: "s" }) ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean2 : string | boolean
>({ a: 1, b: "s" }) ? exprString1 : exprBoolean1 : string | boolean
>({ a: 1, b: "s" }) : { a: number; b: string; }
>{ a: 1, b: "s" } : { a: number; b: string; }
>a : number
>b : string
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny3 = foo() ? exprAny1 : exprAny2;
>resultIsAny3 : any
>foo() ? exprAny1 : exprAny2 : any
@@ -294,3 +333,13 @@ var resultIsObject3 = condObject.valueOf() ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean3 = C.doIt() ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean3 : string | boolean
>C.doIt() ? exprString1 : exprBoolean1 : string | boolean
>C.doIt() : void
>C.doIt : () => void
>C : typeof C
>doIt : () => void
>exprString1 : string
>exprBoolean1 : boolean
@@ -21,6 +21,7 @@ condAny ? exprBoolean1 : exprBoolean2;
condAny ? exprNumber1 : exprNumber2;
condAny ? exprString1 : exprString2;
condAny ? exprIsObject1 : exprIsObject2;
condAny ? exprString1 : exprBoolean1; // union
//Cond is an any type literal
null ? exprAny1 : exprAny2;
@@ -28,6 +29,7 @@ null ? exprBoolean1 : exprBoolean2;
undefined ? exprNumber1 : exprNumber2;
[null, undefined] ? exprString1 : exprString2;
[null, undefined] ? exprIsObject1 : exprIsObject2;
undefined ? exprString1 : exprBoolean1; // union
//Cond is an any type expression
x.doSomeThing() ? exprAny1 : exprAny2;
@@ -35,6 +37,7 @@ x("x") ? exprBoolean1 : exprBoolean2;
x(x) ? exprNumber1 : exprNumber2;
x("x") ? exprString1 : exprString2;
x.doSomeThing() ? exprIsObject1 : exprIsObject2;
x.doSomeThing() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condAny ? exprAny1 : exprAny2;
@@ -42,19 +45,23 @@ var resultIsBoolean1 = condAny ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condAny ? exprNumber1 : exprNumber2;
var resultIsString1 = condAny ? exprString1 : exprString2;
var resultIsObject1 = condAny ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condAny ? exprString1 : exprBoolean1; // union
var resultIsAny2 = null ? exprAny1 : exprAny2;
var resultIsBoolean2 = null ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = undefined ? exprNumber1 : exprNumber2;
var resultIsString2 = [null, undefined] ? exprString1 : exprString2;
var resultIsObject2 = [null, undefined] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = null ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean3 = undefined ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean4 = [null, undefined] ? exprString1 : exprBoolean1; // union
var resultIsAny3 = x.doSomeThing() ? exprAny1 : exprAny2;
var resultIsBoolean3 = x("x") ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = x(x) ? exprNumber1 : exprNumber2;
var resultIsString3 = x("x") ? exprString1 : exprString2;
var resultIsObject3 = x.doSomeThing() ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean5 = x.doSomeThing() ? exprString1 : exprBoolean1; // union
//// [conditionalOperatorConditoinIsAnyType.js]
//Cond ? Expr1 : Expr2, Cond is of any type, Expr1 and Expr2 have the same type
@@ -76,31 +83,39 @@ condAny ? exprBoolean1 : exprBoolean2;
condAny ? exprNumber1 : exprNumber2;
condAny ? exprString1 : exprString2;
condAny ? exprIsObject1 : exprIsObject2;
condAny ? exprString1 : exprBoolean1; // union
//Cond is an any type literal
null ? exprAny1 : exprAny2;
null ? exprBoolean1 : exprBoolean2;
undefined ? exprNumber1 : exprNumber2;
[null, undefined] ? exprString1 : exprString2;
[null, undefined] ? exprIsObject1 : exprIsObject2;
undefined ? exprString1 : exprBoolean1; // union
//Cond is an any type expression
x.doSomeThing() ? exprAny1 : exprAny2;
x("x") ? exprBoolean1 : exprBoolean2;
x(x) ? exprNumber1 : exprNumber2;
x("x") ? exprString1 : exprString2;
x.doSomeThing() ? exprIsObject1 : exprIsObject2;
x.doSomeThing() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condAny ? exprAny1 : exprAny2;
var resultIsBoolean1 = condAny ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condAny ? exprNumber1 : exprNumber2;
var resultIsString1 = condAny ? exprString1 : exprString2;
var resultIsObject1 = condAny ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condAny ? exprString1 : exprBoolean1; // union
var resultIsAny2 = null ? exprAny1 : exprAny2;
var resultIsBoolean2 = null ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = undefined ? exprNumber1 : exprNumber2;
var resultIsString2 = [null, undefined] ? exprString1 : exprString2;
var resultIsObject2 = [null, undefined] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = null ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean3 = undefined ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean4 = [null, undefined] ? exprString1 : exprBoolean1; // union
var resultIsAny3 = x.doSomeThing() ? exprAny1 : exprAny2;
var resultIsBoolean3 = x("x") ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = x(x) ? exprNumber1 : exprNumber2;
var resultIsString3 = x("x") ? exprString1 : exprString2;
var resultIsObject3 = x.doSomeThing() ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean5 = x.doSomeThing() ? exprString1 : exprBoolean1; // union
@@ -69,6 +69,12 @@ condAny ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
condAny ? exprString1 : exprBoolean1; // union
>condAny ? exprString1 : exprBoolean1 : string | boolean
>condAny : any
>exprString1 : string
>exprBoolean1 : boolean
//Cond is an any type literal
null ? exprAny1 : exprAny2;
>null ? exprAny1 : exprAny2 : any
@@ -100,6 +106,12 @@ undefined ? exprNumber1 : exprNumber2;
>exprIsObject1 : Object
>exprIsObject2 : Object
undefined ? exprString1 : exprBoolean1; // union
>undefined ? exprString1 : exprBoolean1 : string | boolean
>undefined : undefined
>exprString1 : string
>exprBoolean1 : boolean
//Cond is an any type expression
x.doSomeThing() ? exprAny1 : exprAny2;
>x.doSomeThing() ? exprAny1 : exprAny2 : any
@@ -141,6 +153,15 @@ x.doSomeThing() ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
x.doSomeThing() ? exprString1 : exprBoolean1; // union
>x.doSomeThing() ? exprString1 : exprBoolean1 : string | boolean
>x.doSomeThing() : any
>x.doSomeThing : any
>x : any
>doSomeThing : any
>exprString1 : string
>exprBoolean1 : boolean
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condAny ? exprAny1 : exprAny2;
>resultIsAny1 : any
@@ -177,6 +198,13 @@ var resultIsObject1 = condAny ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean1 = condAny ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean1 : string | boolean
>condAny ? exprString1 : exprBoolean1 : string | boolean
>condAny : any
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny2 = null ? exprAny1 : exprAny2;
>resultIsAny2 : any
>null ? exprAny1 : exprAny2 : any
@@ -212,6 +240,27 @@ var resultIsObject2 = [null, undefined] ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean2 = null ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean2 : string | boolean
>null ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
var resultIsStringOrBoolean3 = undefined ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean3 : string | boolean
>undefined ? exprString1 : exprBoolean1 : string | boolean
>undefined : undefined
>exprString1 : string
>exprBoolean1 : boolean
var resultIsStringOrBoolean4 = [null, undefined] ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean4 : string | boolean
>[null, undefined] ? exprString1 : exprBoolean1 : string | boolean
>[null, undefined] : null[]
>undefined : undefined
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny3 = x.doSomeThing() ? exprAny1 : exprAny2;
>resultIsAny3 : any
>x.doSomeThing() ? exprAny1 : exprAny2 : any
@@ -257,3 +306,13 @@ var resultIsObject3 = x.doSomeThing() ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean5 = x.doSomeThing() ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean5 : string | boolean
>x.doSomeThing() ? exprString1 : exprBoolean1 : string | boolean
>x.doSomeThing() : any
>x.doSomeThing : any
>x : any
>doSomeThing : any
>exprString1 : string
>exprBoolean1 : boolean
@@ -20,6 +20,7 @@ condString ? exprBoolean1 : exprBoolean2;
condString ? exprNumber1 : exprNumber2;
condString ? exprString1 : exprString2;
condString ? exprIsObject1 : exprIsObject2;
condString ? exprString1 : exprBoolean1; // union
//Cond is a string type literal
"" ? exprAny1 : exprAny2;
@@ -27,6 +28,7 @@ condString ? exprIsObject1 : exprIsObject2;
'c' ? exprNumber1 : exprNumber2;
'string' ? exprString1 : exprString2;
" " ? exprIsObject1 : exprIsObject2;
"hello " ? exprString1 : exprBoolean1; // union
//Cond is a string type expression
function foo() { return "string" };
@@ -37,6 +39,7 @@ condString.toUpperCase ? exprBoolean1 : exprBoolean2;
condString + "string" ? exprNumber1 : exprNumber2;
foo() ? exprString1 : exprString2;
array[1] ? exprIsObject1 : exprIsObject2;
foo() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condString ? exprAny1 : exprAny2;
@@ -44,19 +47,22 @@ var resultIsBoolean1 = condString ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condString ? exprNumber1 : exprNumber2;
var resultIsString1 = condString ? exprString1 : exprString2;
var resultIsObject1 = condString ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condString ? exprString1 : exprBoolean1; // union
var resultIsAny2 = "" ? exprAny1 : exprAny2;
var resultIsBoolean2 = "string" ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = 'c' ? exprNumber1 : exprNumber2;
var resultIsString2 = 'string' ? exprString1 : exprString2;
var resultIsObject2 = " " ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = "hello" ? exprString1 : exprBoolean1; // union
var resultIsAny3 = typeof condString ? exprAny1 : exprAny2;
var resultIsBoolean3 = condString.toUpperCase ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = condString + "string" ? exprNumber1 : exprNumber2;
var resultIsString3 = foo() ? exprString1 : exprString2;
var resultIsObject3 = array[1] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = typeof condString ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean4 = condString.toUpperCase ? exprString1 : exprBoolean1; // union
//// [conditionalOperatorConditoinIsStringType.js]
//Cond ? Expr1 : Expr2, Cond is of string type, Expr1 and Expr2 have the same type
@@ -77,12 +83,14 @@ condString ? exprBoolean1 : exprBoolean2;
condString ? exprNumber1 : exprNumber2;
condString ? exprString1 : exprString2;
condString ? exprIsObject1 : exprIsObject2;
condString ? exprString1 : exprBoolean1; // union
//Cond is a string type literal
"" ? exprAny1 : exprAny2;
"string" ? exprBoolean1 : exprBoolean2;
'c' ? exprNumber1 : exprNumber2;
'string' ? exprString1 : exprString2;
" " ? exprIsObject1 : exprIsObject2;
"hello " ? exprString1 : exprBoolean1; // union
//Cond is a string type expression
function foo() {
return "string";
@@ -94,19 +102,24 @@ condString.toUpperCase ? exprBoolean1 : exprBoolean2;
condString + "string" ? exprNumber1 : exprNumber2;
foo() ? exprString1 : exprString2;
array[1] ? exprIsObject1 : exprIsObject2;
foo() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condString ? exprAny1 : exprAny2;
var resultIsBoolean1 = condString ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condString ? exprNumber1 : exprNumber2;
var resultIsString1 = condString ? exprString1 : exprString2;
var resultIsObject1 = condString ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condString ? exprString1 : exprBoolean1; // union
var resultIsAny2 = "" ? exprAny1 : exprAny2;
var resultIsBoolean2 = "string" ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = 'c' ? exprNumber1 : exprNumber2;
var resultIsString2 = 'string' ? exprString1 : exprString2;
var resultIsObject2 = " " ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = "hello" ? exprString1 : exprBoolean1; // union
var resultIsAny3 = typeof condString ? exprAny1 : exprAny2;
var resultIsBoolean3 = condString.toUpperCase ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = condString + "string" ? exprNumber1 : exprNumber2;
var resultIsString3 = foo() ? exprString1 : exprString2;
var resultIsObject3 = array[1] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = typeof condString ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean4 = condString.toUpperCase ? exprString1 : exprBoolean1; // union
@@ -66,6 +66,12 @@ condString ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
condString ? exprString1 : exprBoolean1; // union
>condString ? exprString1 : exprBoolean1 : string | boolean
>condString : string
>exprString1 : string
>exprBoolean1 : boolean
//Cond is a string type literal
"" ? exprAny1 : exprAny2;
>"" ? exprAny1 : exprAny2 : any
@@ -92,6 +98,11 @@ condString ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
"hello " ? exprString1 : exprBoolean1; // union
>"hello " ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
//Cond is a string type expression
function foo() { return "string" };
>foo : () => string
@@ -136,6 +147,13 @@ array[1] ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
foo() ? exprString1 : exprBoolean1; // union
>foo() ? exprString1 : exprBoolean1 : string | boolean
>foo() : string
>foo : () => string
>exprString1 : string
>exprBoolean1 : boolean
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condString ? exprAny1 : exprAny2;
>resultIsAny1 : any
@@ -172,6 +190,13 @@ var resultIsObject1 = condString ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean1 = condString ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean1 : string | boolean
>condString ? exprString1 : exprBoolean1 : string | boolean
>condString : string
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny2 = "" ? exprAny1 : exprAny2;
>resultIsAny2 : any
>"" ? exprAny1 : exprAny2 : any
@@ -202,6 +227,12 @@ var resultIsObject2 = " " ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean2 = "hello" ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean2 : string | boolean
>"hello" ? exprString1 : exprBoolean1 : string | boolean
>exprString1 : string
>exprBoolean1 : boolean
var resultIsAny3 = typeof condString ? exprAny1 : exprAny2;
>resultIsAny3 : any
>typeof condString ? exprAny1 : exprAny2 : any
@@ -243,3 +274,20 @@ var resultIsObject3 = array[1] ? exprIsObject1 : exprIsObject2;
>exprIsObject1 : Object
>exprIsObject2 : Object
var resultIsStringOrBoolean3 = typeof condString ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean3 : string | boolean
>typeof condString ? exprString1 : exprBoolean1 : string | boolean
>typeof condString : string
>condString : string
>exprString1 : string
>exprBoolean1 : boolean
var resultIsStringOrBoolean4 = condString.toUpperCase ? exprString1 : exprBoolean1; // union
>resultIsStringOrBoolean4 : string | boolean
>condString.toUpperCase ? exprString1 : exprBoolean1 : string | boolean
>condString.toUpperCase : () => string
>condString : string
>toUpperCase : () => string
>exprString1 : string
>exprBoolean1 : boolean
@@ -4,13 +4,13 @@ tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithou
tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithoutIdenticalBCT.ts(16,5): error TS2322: Type 'A | B' is not assignable to type 'B'.
Type 'A' is not assignable to type 'B'.
Property 'propertyB' is missing in type 'A'.
tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithoutIdenticalBCT.ts(18,5): error TS2322: Type '((m: X) => number) | ((n: X) => string)' is not assignable to type '(t: X) => number'.
tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithoutIdenticalBCT.ts(19,5): error TS2322: Type '((m: X) => number) | ((n: X) => string)' is not assignable to type '(t: X) => number'.
Type '(n: X) => string' is not assignable to type '(t: X) => number'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithoutIdenticalBCT.ts(19,5): error TS2322: Type '((m: X) => number) | ((n: X) => string)' is not assignable to type '(t: X) => string'.
tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithoutIdenticalBCT.ts(20,5): error TS2322: Type '((m: X) => number) | ((n: X) => string)' is not assignable to type '(t: X) => string'.
Type '(m: X) => number' is not assignable to type '(t: X) => string'.
Type 'number' is not assignable to type 'string'.
tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithoutIdenticalBCT.ts(20,5): error TS2322: Type '((m: X) => number) | ((n: X) => string)' is not assignable to type '(t: X) => boolean'.
tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithoutIdenticalBCT.ts(21,5): error TS2322: Type '((m: X) => number) | ((n: X) => string)' is not assignable to type '(t: X) => boolean'.
Type '(m: X) => number' is not assignable to type '(t: X) => boolean'.
Type 'number' is not assignable to type 'boolean'.
@@ -40,6 +40,7 @@ tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithou
!!! error TS2322: Type 'A | B' is not assignable to type 'B'.
!!! error TS2322: Type 'A' is not assignable to type 'B'.
!!! error TS2322: Property 'propertyB' is missing in type 'A'.
var result31: A | B = true ? a : b;
var result4: (t: X) => number = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
~~~~~~~
@@ -55,4 +56,6 @@ tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithou
~~~~~~~
!!! error TS2322: Type '((m: X) => number) | ((n: X) => string)' is not assignable to type '(t: X) => boolean'.
!!! error TS2322: Type '(m: X) => number' is not assignable to type '(t: X) => boolean'.
!!! error TS2322: Type 'number' is not assignable to type 'boolean'.
!!! error TS2322: Type 'number' is not assignable to type 'boolean'.
var result61: (t: X) => number| string = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
@@ -15,10 +15,13 @@ var result1 = true ? a : b;
//Be contextually typed and and bct is not identical, results in errors that union type is not assignable to target
var result2: A = true ? a : b;
var result3: B = true ? a : b;
var result31: A | B = true ? a : b;
var result4: (t: X) => number = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result5: (t: X) => string = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result6: (t: X) => boolean = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result6: (t: X) => boolean = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result61: (t: X) => number| string = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
//// [conditionalOperatorWithoutIdenticalBCT.js]
var __extends = this.__extends || function (d, b) {
@@ -59,6 +62,8 @@ var result1 = true ? a : b;
//Be contextually typed and and bct is not identical, results in errors that union type is not assignable to target
var result2 = true ? a : b;
var result3 = true ? a : b;
var result31 = true ? a : b;
var result4 = true ? function (m) { return m.propertyX1; } : function (n) { return n.propertyX2; };
var result5 = true ? function (m) { return m.propertyX1; } : function (n) { return n.propertyX2; };
var result6 = true ? function (m) { return m.propertyX1; } : function (n) { return n.propertyX2; };
var result61 = true ? function (m) { return m.propertyX1; } : function (n) { return n.propertyX2; };
@@ -4,21 +4,27 @@ tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(3,5): error TS232
Type 'string | number | boolean' is not assignable to type 'string | number'.
Type 'boolean' is not assignable to type 'string | number'.
Type 'boolean' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(8,1): error TS2322: Type '[number, string, boolean]' is not assignable to type '[number, string]'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(11,1): error TS2322: Type '[{}, number]' is not assignable to type '[{ a: string; }, number]'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(15,1): error TS2322: Type '[number, string, boolean]' is not assignable to type '[number, string]'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(18,1): error TS2322: Type '[{}, number]' is not assignable to type '[{ a: string; }, number]'.
Types of property '0' are incompatible.
Type '{}' is not assignable to type '{ a: string; }'.
Property 'a' is missing in type '{}'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(12,1): error TS2322: Type '[number, string]' is not assignable to type '[number, string, boolean]'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(19,1): error TS2322: Type '[number, string]' is not assignable to type '[number, string, boolean]'.
Property '2' is missing in type '[number, string]'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(13,5): error TS2322: Type '[string, string, number]' is not assignable to type '[string, string]'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(20,5): error TS2322: Type '[string, string, number]' is not assignable to type '[string, string]'.
Types of property 'pop' are incompatible.
Type '() => string | number' is not assignable to type '() => string'.
Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(24,1): error TS2322: Type '[C, string | number]' is not assignable to type '[C, string | number, D]'.
Property '2' is missing in type '[C, string | number]'.
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(25,1): error TS2322: Type '[number, string | number]' is not assignable to type '[number, string]'.
Types of property '1' are incompatible.
Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'.
==== tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts (5 errors) ====
==== tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts (7 errors) ====
// no error
var numStrTuple: [number, string] = [5, "hello"];
var numStrTuple2: [number, string] = [5, "foo", true];
@@ -32,6 +38,13 @@ tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(13,5): error TS23
var numStrBoolTuple: [number, string, boolean] = [5, "foo", true];
var objNumTuple: [{ a: string }, number] = [{ a: "world" }, 5];
var strTupleTuple: [string, [number, {}]] = ["bar", [5, { x: 1, y: 1 }]];
class C { }
class D { }
var unionTuple: [C, string | number] = [new C(), "foo"];
var unionTuple1: [C, string | number] = [new C(), "foo"];
var unionTuple2: [C, string | number, D] = [new C(), "foo", new D()];
var unionTuple3: [number, string| number] = [10, "foo"];
numStrTuple = numStrTuple2;
numStrTuple = numStrBoolTuple;
~~~~~~~~~~~
@@ -55,4 +68,16 @@ tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(13,5): error TS23
!!! error TS2322: Type '() => string | number' is not assignable to type '() => string'.
!!! error TS2322: Type 'string | number' is not assignable to type 'string'.
!!! error TS2322: Type 'number' is not assignable to type 'string'.
unionTuple = unionTuple1;
unionTuple = unionTuple2;
unionTuple2 = unionTuple;
~~~~~~~~~~~
!!! error TS2322: Type '[C, string | number]' is not assignable to type '[C, string | number, D]'.
!!! error TS2322: Property '2' is missing in type '[C, string | number]'.
numStrTuple = unionTuple3;
~~~~~~~~~~~
!!! error TS2322: Type '[number, string | number]' is not assignable to type '[number, string]'.
!!! error TS2322: Types of property '1' are incompatible.
!!! error TS2322: Type 'string | number' is not assignable to type 'string'.
!!! error TS2322: Type 'number' is not assignable to type 'string'.
@@ -5,6 +5,13 @@ var numStrTuple2: [number, string] = [5, "foo", true];
var numStrBoolTuple: [number, string, boolean] = [5, "foo", true];
var objNumTuple: [{ a: string }, number] = [{ a: "world" }, 5];
var strTupleTuple: [string, [number, {}]] = ["bar", [5, { x: 1, y: 1 }]];
class C { }
class D { }
var unionTuple: [C, string | number] = [new C(), "foo"];
var unionTuple1: [C, string | number] = [new C(), "foo"];
var unionTuple2: [C, string | number, D] = [new C(), "foo", new D()];
var unionTuple3: [number, string| number] = [10, "foo"];
numStrTuple = numStrTuple2;
numStrTuple = numStrBoolTuple;
@@ -12,7 +19,11 @@ numStrTuple = numStrBoolTuple;
objNumTuple = [ {}, 5];
numStrBoolTuple = numStrTuple;
var strStrTuple: [string, string] = ["foo", "bar", 5];
unionTuple = unionTuple1;
unionTuple = unionTuple2;
unionTuple2 = unionTuple;
numStrTuple = unionTuple3;
//// [contextualTypeWithTuple.js]
// no error
@@ -21,9 +32,27 @@ var numStrTuple2 = [5, "foo", true];
var numStrBoolTuple = [5, "foo", true];
var objNumTuple = [{ a: "world" }, 5];
var strTupleTuple = ["bar", [5, { x: 1, y: 1 }]];
var C = (function () {
function C() {
}
return C;
})();
var D = (function () {
function D() {
}
return D;
})();
var unionTuple = [new C(), "foo"];
var unionTuple1 = [new C(), "foo"];
var unionTuple2 = [new C(), "foo", new D()];
var unionTuple3 = [10, "foo"];
numStrTuple = numStrTuple2;
numStrTuple = numStrBoolTuple;
// error
objNumTuple = [{}, 5];
numStrBoolTuple = numStrTuple;
var strStrTuple = ["foo", "bar", 5];
unionTuple = unionTuple1;
unionTuple = unionTuple2;
unionTuple2 = unionTuple;
numStrTuple = unionTuple3;
@@ -6,9 +6,15 @@ tests/cases/conformance/functions/functionImplementationErrors.ts(25,16): error
tests/cases/conformance/functions/functionImplementationErrors.ts(30,17): error TS2373: Initializer of parameter 'n' cannot reference identifier 'm' declared after it.
tests/cases/conformance/functions/functionImplementationErrors.ts(35,17): error TS2373: Initializer of parameter 'n' cannot reference identifier 'm' declared after it.
tests/cases/conformance/functions/functionImplementationErrors.ts(40,28): error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value or consist of a single 'throw' statement.
tests/cases/conformance/functions/functionImplementationErrors.ts(49,1): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(53,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(57,11): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(61,1): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(65,11): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(69,11): error TS2354: No best common type exists among return expressions.
==== tests/cases/conformance/functions/functionImplementationErrors.ts (8 errors) ====
==== tests/cases/conformance/functions/functionImplementationErrors.ts (14 errors) ====
// FunctionExpression with no return type annotation with multiple return statements with unrelated types
var f1 = function () {
~~~~~~~~~~~~~
@@ -83,4 +89,63 @@ tests/cases/conformance/functions/functionImplementationErrors.ts(40,28): error
throw undefined;
var x = 4;
};
class Base { private x; }
class AnotherClass { private y; }
class Derived1 extends Base { private m; }
class Derived2 extends Base { private n; }
function f8() {
~~~~~~~~~~~~~~~
return new Derived1();
~~~~~~~~~~~~~~~~~~~~~~~~~~
return new Derived2();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
~
!!! error TS2354: No best common type exists among return expressions.
var f9 = function () {
~~~~~~~~~~~~~
return new Derived1();
~~~~~~~~~~~~~~~~~~~~~~~~~~
return new Derived2();
~~~~~~~~~~~~~~~~~~~~~~~~~~
};
~
!!! error TS2354: No best common type exists among return expressions.
var f10 = () => {
~~~~~~~
return new Derived1();
~~~~~~~~~~~~~~~~~~~~~~~~~~
return new Derived2();
~~~~~~~~~~~~~~~~~~~~~~~~~~
};
~
!!! error TS2354: No best common type exists among return expressions.
function f11() {
~~~~~~~~~~~~~~~~
return new Base();
~~~~~~~~~~~~~~~~~~~~~~
return new AnotherClass();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
~
!!! error TS2354: No best common type exists among return expressions.
var f12 = function () {
~~~~~~~~~~~~~
return new Base();
~~~~~~~~~~~~~~~~~~~~~~
return new AnotherClass();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
};
~
!!! error TS2354: No best common type exists among return expressions.
var f13 = () => {
~~~~~~~
return new Base();
~~~~~~~~~~~~~~~~~~~~~~
return new AnotherClass();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
};
~
!!! error TS2354: No best common type exists among return expressions.
@@ -42,9 +42,44 @@ undefined === function (): number {
throw undefined;
var x = 4;
};
class Base { private x; }
class AnotherClass { private y; }
class Derived1 extends Base { private m; }
class Derived2 extends Base { private n; }
function f8() {
return new Derived1();
return new Derived2();
}
var f9 = function () {
return new Derived1();
return new Derived2();
};
var f10 = () => {
return new Derived1();
return new Derived2();
};
function f11() {
return new Base();
return new AnotherClass();
}
var f12 = function () {
return new Base();
return new AnotherClass();
};
var f13 = () => {
return new Base();
return new AnotherClass();
};
//// [functionImplementationErrors.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 __();
};
// FunctionExpression with no return type annotation with multiple return statements with unrelated types
var f1 = function () {
return '';
@@ -86,3 +121,51 @@ undefined === function () {
throw undefined;
var x = 4;
};
var Base = (function () {
function Base() {
}
return Base;
})();
var AnotherClass = (function () {
function AnotherClass() {
}
return AnotherClass;
})();
var Derived1 = (function (_super) {
__extends(Derived1, _super);
function Derived1() {
_super.apply(this, arguments);
}
return Derived1;
})(Base);
var Derived2 = (function (_super) {
__extends(Derived2, _super);
function Derived2() {
_super.apply(this, arguments);
}
return Derived2;
})(Base);
function f8() {
return new Derived1();
return new Derived2();
}
var f9 = function () {
return new Derived1();
return new Derived2();
};
var f10 = function () {
return new Derived1();
return new Derived2();
};
function f11() {
return new Base();
return new AnotherClass();
}
var f12 = function () {
return new Base();
return new AnotherClass();
};
var f13 = function () {
return new Base();
return new AnotherClass();
};
@@ -70,6 +70,10 @@ var n = function () {
return 5;
}();
// Otherwise, the inferred return type is the first of the types of the return statement expressions
// in the function body that is a supertype of each of the others,
// ignoring return statements with no expressions.
// A compile - time error occurs if no return statement expression has a type that is a supertype of each of the others.
// FunctionExpression with no return type annotation with multiple return statements with subtype relation between returns
class Base { private m; }
class Derived extends Base { private q; }
@@ -120,9 +124,37 @@ function f6(): number {
return;
}
class Derived2 extends Base { private r: string; }
class AnotherClass { private x }
// if f is a contextually typed function expression, the inferred return type is the union type
// of the types of the return statement expressions in the function body,
// ignoring return statements with no expressions.
var f7: (x: number) => string | number = x => { // should be (x: number) => number | string
if (x < 0) { return x; }
return x.toString();
}
var f8: (x: number) => any = x => { // should be (x: number) => Base
return new Base();
return new Derived2();
}
var f9: (x: number) => any = x => { // should be (x: number) => Base
return new Base();
return new Derived();
return new Derived2();
}
var f10: (x: number) => any = x => { // should be (x: number) => Derived | Derived1
return new Derived();
return new Derived2();
}
var f11: (x: number) => any = x => { // should be (x: number) => Base | AnotherClass
return new Base();
return new AnotherClass();
}
var f12: (x: number) => any = x => { // should be (x: number) => Base | AnotherClass
return new Base();
return; // should be ignored
return new AnotherClass();
}
//// [functionImplementations.js]
var __extends = this.__extends || function (d, b) {
@@ -192,6 +224,10 @@ var n = function () {
return 3;
return 5;
}();
// Otherwise, the inferred return type is the first of the types of the return statement expressions
// in the function body that is a supertype of each of the others,
// ignoring return statements with no expressions.
// A compile - time error occurs if no return statement expression has a type that is a supertype of each of the others.
// FunctionExpression with no return type annotation with multiple return statements with subtype relation between returns
var Base = (function () {
function Base() {
@@ -249,3 +285,46 @@ function opt3(n, m) {
function f6() {
return;
}
var Derived2 = (function (_super) {
__extends(Derived2, _super);
function Derived2() {
_super.apply(this, arguments);
}
return Derived2;
})(Base);
var AnotherClass = (function () {
function AnotherClass() {
}
return AnotherClass;
})();
// if f is a contextually typed function expression, the inferred return type is the union type
// of the types of the return statement expressions in the function body,
// ignoring return statements with no expressions.
var f7 = function (x) {
if (x < 0) {
return x;
}
return x.toString();
};
var f8 = function (x) {
return new Base();
return new Derived2();
};
var f9 = function (x) {
return new Base();
return new Derived();
return new Derived2();
};
var f10 = function (x) {
return new Derived();
return new Derived2();
};
var f11 = function (x) {
return new Base();
return new AnotherClass();
};
var f12 = function (x) {
return new Base();
return; // should be ignored
return new AnotherClass();
};
@@ -168,6 +168,10 @@ var n = function () {
return 5;
}();
// Otherwise, the inferred return type is the first of the types of the return statement expressions
// in the function body that is a supertype of each of the others,
// ignoring return statements with no expressions.
// A compile - time error occurs if no return statement expression has a type that is a supertype of each of the others.
// FunctionExpression with no return type annotation with multiple return statements with subtype relation between returns
class Base { private m; }
>Base : Base
@@ -292,6 +296,107 @@ function f6(): number {
return;
}
class Derived2 extends Base { private r: string; }
>Derived2 : Derived2
>Base : Base
>r : string
class AnotherClass { private x }
>AnotherClass : AnotherClass
>x : any
// if f is a contextually typed function expression, the inferred return type is the union type
// of the types of the return statement expressions in the function body,
// ignoring return statements with no expressions.
var f7: (x: number) => string | number = x => { // should be (x: number) => number | string
>f7 : (x: number) => string | number
>x : number
>x => { // should be (x: number) => number | string if (x < 0) { return x; } return x.toString();} : (x: number) => string | number
>x : number
if (x < 0) { return x; }
>x < 0 : boolean
>x : number
>x : number
return x.toString();
>x.toString() : string
>x.toString : (radix?: number) => string
>x : number
>toString : (radix?: number) => string
}
var f8: (x: number) => any = x => { // should be (x: number) => Base
>f8 : (x: number) => any
>x : number
>x => { // should be (x: number) => Base return new Base(); return new Derived2();} : (x: number) => Base
>x : number
return new Base();
>new Base() : Base
>Base : typeof Base
return new Derived2();
>new Derived2() : Derived2
>Derived2 : typeof Derived2
}
var f9: (x: number) => any = x => { // should be (x: number) => Base
>f9 : (x: number) => any
>x : number
>x => { // should be (x: number) => Base return new Base(); return new Derived(); return new Derived2();} : (x: number) => Base
>x : number
return new Base();
>new Base() : Base
>Base : typeof Base
return new Derived();
>new Derived() : Derived
>Derived : typeof Derived
return new Derived2();
>new Derived2() : Derived2
>Derived2 : typeof Derived2
}
var f10: (x: number) => any = x => { // should be (x: number) => Derived | Derived1
>f10 : (x: number) => any
>x : number
>x => { // should be (x: number) => Derived | Derived1 return new Derived(); return new Derived2();} : (x: number) => Derived | Derived2
>x : number
return new Derived();
>new Derived() : Derived
>Derived : typeof Derived
return new Derived2();
>new Derived2() : Derived2
>Derived2 : typeof Derived2
}
var f11: (x: number) => any = x => { // should be (x: number) => Base | AnotherClass
>f11 : (x: number) => any
>x : number
>x => { // should be (x: number) => Base | AnotherClass return new Base(); return new AnotherClass();} : (x: number) => Base | AnotherClass
>x : number
return new Base();
>new Base() : Base
>Base : typeof Base
return new AnotherClass();
>new AnotherClass() : AnotherClass
>AnotherClass : typeof AnotherClass
}
var f12: (x: number) => any = x => { // should be (x: number) => Base | AnotherClass
>f12 : (x: number) => any
>x : number
>x => { // should be (x: number) => Base | AnotherClass return new Base(); return; // should be ignored return new AnotherClass();} : (x: number) => Base | AnotherClass
>x : number
return new Base();
>new Base() : Base
>Base : typeof Base
return; // should be ignored
return new AnotherClass();
>new AnotherClass() : AnotherClass
>AnotherClass : typeof AnotherClass
}
+41 -8
View File
@@ -1,32 +1,65 @@
//// [indexerWithTuple.ts]
var strNumTuple: [string, number] = ["foo", 10];
var numTupleTuple: [number, [string, number]] = [10, ["bar", 20]];
var unionTuple1: [number, string| number] = [10, "foo"];
var unionTuple2: [boolean, string| number] = [true, "foo"];
// no error
var idx0 = 0;
var idx1 = 1;
var ele10 = strNumTuple[0]; // string
var ele11 = strNumTuple[1]; // number
var ele12 = strNumTuple[2]; // {}
var ele13 = strNumTuple[idx0]; // {}
var ele14 = strNumTuple[idx1]; // {}
var ele12 = strNumTuple[2]; // string | number
var ele13 = strNumTuple[idx0]; // string | number
var ele14 = strNumTuple[idx1]; // string | number
var ele15 = strNumTuple["0"]; // string
var ele16 = strNumTuple["1"]; // number
var strNumTuple1 = numTupleTuple[1]; //[string, number];
var ele17 = numTupleTuple[2]; // {}
var ele17 = numTupleTuple[2]; // number | [string, number]
var eleUnion10 = unionTuple1[0]; // number
var eleUnion11 = unionTuple1[1]; // string | number
var eleUnion12 = unionTuple1[2]; // string | number
var eleUnion13 = unionTuple1[idx0]; // string | number
var eleUnion14 = unionTuple1[idx1]; // string | number
var eleUnion15 = unionTuple1["0"]; // number
var eleUnion16 = unionTuple1["1"]; // string | number
var eleUnion20 = unionTuple2[0]; // boolean
var eleUnion21 = unionTuple2[1]; // string | number
var eleUnion22 = unionTuple2[2]; // string | number | boolean
var eleUnion23 = unionTuple2[idx0]; // string | number | boolean
var eleUnion24 = unionTuple2[idx1]; // string | number | boolean
var eleUnion25 = unionTuple2["0"]; // boolean
var eleUnion26 = unionTuple2["1"]; // string | number
//// [indexerWithTuple.js]
var strNumTuple = ["foo", 10];
var numTupleTuple = [10, ["bar", 20]];
var unionTuple1 = [10, "foo"];
var unionTuple2 = [true, "foo"];
// no error
var idx0 = 0;
var idx1 = 1;
var ele10 = strNumTuple[0]; // string
var ele11 = strNumTuple[1]; // number
var ele12 = strNumTuple[2]; // {}
var ele13 = strNumTuple[idx0]; // {}
var ele14 = strNumTuple[idx1]; // {}
var ele12 = strNumTuple[2]; // string | number
var ele13 = strNumTuple[idx0]; // string | number
var ele14 = strNumTuple[idx1]; // string | number
var ele15 = strNumTuple["0"]; // string
var ele16 = strNumTuple["1"]; // number
var strNumTuple1 = numTupleTuple[1]; //[string, number];
var ele17 = numTupleTuple[2]; // {}
var ele17 = numTupleTuple[2]; // number | [string, number]
var eleUnion10 = unionTuple1[0]; // number
var eleUnion11 = unionTuple1[1]; // string | number
var eleUnion12 = unionTuple1[2]; // string | number
var eleUnion13 = unionTuple1[idx0]; // string | number
var eleUnion14 = unionTuple1[idx1]; // string | number
var eleUnion15 = unionTuple1["0"]; // number
var eleUnion16 = unionTuple1["1"]; // string | number
var eleUnion20 = unionTuple2[0]; // boolean
var eleUnion21 = unionTuple2[1]; // string | number
var eleUnion22 = unionTuple2[2]; // string | number | boolean
var eleUnion23 = unionTuple2[idx0]; // string | number | boolean
var eleUnion24 = unionTuple2[idx1]; // string | number | boolean
var eleUnion25 = unionTuple2["0"]; // boolean
var eleUnion26 = unionTuple2["1"]; // string | number
@@ -8,6 +8,14 @@ var numTupleTuple: [number, [string, number]] = [10, ["bar", 20]];
>[10, ["bar", 20]] : [number, [string, number]]
>["bar", 20] : [string, number]
var unionTuple1: [number, string| number] = [10, "foo"];
>unionTuple1 : [number, string | number]
>[10, "foo"] : [number, string]
var unionTuple2: [boolean, string| number] = [true, "foo"];
>unionTuple2 : [boolean, string | number]
>[true, "foo"] : [boolean, string]
// no error
var idx0 = 0;
>idx0 : number
@@ -25,18 +33,18 @@ var ele11 = strNumTuple[1]; // number
>strNumTuple[1] : number
>strNumTuple : [string, number]
var ele12 = strNumTuple[2]; // {}
var ele12 = strNumTuple[2]; // string | number
>ele12 : string | number
>strNumTuple[2] : string | number
>strNumTuple : [string, number]
var ele13 = strNumTuple[idx0]; // {}
var ele13 = strNumTuple[idx0]; // string | number
>ele13 : string | number
>strNumTuple[idx0] : string | number
>strNumTuple : [string, number]
>idx0 : number
var ele14 = strNumTuple[idx1]; // {}
var ele14 = strNumTuple[idx1]; // string | number
>ele14 : string | number
>strNumTuple[idx1] : string | number
>strNumTuple : [string, number]
@@ -57,8 +65,82 @@ var strNumTuple1 = numTupleTuple[1]; //[string, number];
>numTupleTuple[1] : [string, number]
>numTupleTuple : [number, [string, number]]
var ele17 = numTupleTuple[2]; // {}
var ele17 = numTupleTuple[2]; // number | [string, number]
>ele17 : number | [string, number]
>numTupleTuple[2] : number | [string, number]
>numTupleTuple : [number, [string, number]]
var eleUnion10 = unionTuple1[0]; // number
>eleUnion10 : number
>unionTuple1[0] : number
>unionTuple1 : [number, string | number]
var eleUnion11 = unionTuple1[1]; // string | number
>eleUnion11 : string | number
>unionTuple1[1] : string | number
>unionTuple1 : [number, string | number]
var eleUnion12 = unionTuple1[2]; // string | number
>eleUnion12 : string | number
>unionTuple1[2] : string | number
>unionTuple1 : [number, string | number]
var eleUnion13 = unionTuple1[idx0]; // string | number
>eleUnion13 : string | number
>unionTuple1[idx0] : string | number
>unionTuple1 : [number, string | number]
>idx0 : number
var eleUnion14 = unionTuple1[idx1]; // string | number
>eleUnion14 : string | number
>unionTuple1[idx1] : string | number
>unionTuple1 : [number, string | number]
>idx1 : number
var eleUnion15 = unionTuple1["0"]; // number
>eleUnion15 : number
>unionTuple1["0"] : number
>unionTuple1 : [number, string | number]
var eleUnion16 = unionTuple1["1"]; // string | number
>eleUnion16 : string | number
>unionTuple1["1"] : string | number
>unionTuple1 : [number, string | number]
var eleUnion20 = unionTuple2[0]; // boolean
>eleUnion20 : boolean
>unionTuple2[0] : boolean
>unionTuple2 : [boolean, string | number]
var eleUnion21 = unionTuple2[1]; // string | number
>eleUnion21 : string | number
>unionTuple2[1] : string | number
>unionTuple2 : [boolean, string | number]
var eleUnion22 = unionTuple2[2]; // string | number | boolean
>eleUnion22 : string | number | boolean
>unionTuple2[2] : string | number | boolean
>unionTuple2 : [boolean, string | number]
var eleUnion23 = unionTuple2[idx0]; // string | number | boolean
>eleUnion23 : string | number | boolean
>unionTuple2[idx0] : string | number | boolean
>unionTuple2 : [boolean, string | number]
>idx0 : number
var eleUnion24 = unionTuple2[idx1]; // string | number | boolean
>eleUnion24 : string | number | boolean
>unionTuple2[idx1] : string | number | boolean
>unionTuple2 : [boolean, string | number]
>idx1 : number
var eleUnion25 = unionTuple2["0"]; // boolean
>eleUnion25 : boolean
>unionTuple2["0"] : boolean
>unionTuple2 : [boolean, string | number]
var eleUnion26 = unionTuple2["1"]; // string | number
>eleUnion26 : string | number
>unionTuple2["1"] : string | number
>unionTuple2 : [boolean, string | number]
@@ -28,77 +28,77 @@ var ra10 = undefined || a1; // undefined || any is any
var rb1 = a1 || a2; // any || boolean is any
var rb2 = a2 || a2; // boolean || boolean is boolean
var rb3 = a3 || a2; // number || boolean is {}
var rb4 = a4 || a2; // string || boolean is {}
var rb5 = a5 || a2; // void || boolean is {}
var rb6 = a6 || a2; // enum || boolean is {}
var rb7 = a7 || a2; // object || boolean is {}
var rb8 = a8 || a2; // array || boolean is {}
var rb3 = a3 || a2; // number || boolean is number | boolean
var rb4 = a4 || a2; // string || boolean is string | boolean
var rb5 = a5 || a2; // void || boolean is void | boolean
var rb6 = a6 || a2; // enum || boolean is E | boolean
var rb7 = a7 || a2; // object || boolean is object | boolean
var rb8 = a8 || a2; // array || boolean is array | boolean
var rb9 = null || a2; // null || boolean is boolean
var rb10= undefined || a2; // undefined || boolean is boolean
var rc1 = a1 || a3; // any || number is any
var rc2 = a2 || a3; // boolean || number is {}
var rc2 = a2 || a3; // boolean || number is boolean | number
var rc3 = a3 || a3; // number || number is number
var rc4 = a4 || a3; // string || number is {}
var rc5 = a5 || a3; // void || number is {}
var rc4 = a4 || a3; // string || number is string | number
var rc5 = a5 || a3; // void || number is void | number
var rc6 = a6 || a3; // enum || number is number
var rc7 = a7 || a3; // object || number is {}
var rc8 = a8 || a3; // array || number is {}
var rc7 = a7 || a3; // object || number is object | number
var rc8 = a8 || a3; // array || number is array | number
var rc9 = null || a3; // null || number is number
var rc10 = undefined || a3; // undefined || number is number
var rd1 = a1 || a4; // any || string is any
var rd2 = a2 || a4; // boolean || string is {}
var rd3 = a3 || a4; // number || string is {}
var rd2 = a2 || a4; // boolean || string is boolean | string
var rd3 = a3 || a4; // number || string is number | string
var rd4 = a4 || a4; // string || string is string
var rd5 = a5 || a4; // void || string is {}
var rd6 = a6 || a4; // enum || string is {}
var rd7 = a7 || a4; // object || string is {}
var rd8 = a8 || a4; // array || string is {}
var rd5 = a5 || a4; // void || string is void | string
var rd6 = a6 || a4; // enum || string is enum | string
var rd7 = a7 || a4; // object || string is object | string
var rd8 = a8 || a4; // array || string is array | string
var rd9 = null || a4; // null || string is string
var rd10 = undefined || a4; // undefined || string is string
var re1 = a1 || a5; // any || void is any
var re2 = a2 || a5; // boolean || void is {}
var re3 = a3 || a5; // number || void is {}
var re4 = a4 || a5; // string || void is {}
var re2 = a2 || a5; // boolean || void is boolean | void
var re3 = a3 || a5; // number || void is number | void
var re4 = a4 || a5; // string || void is string | void
var re5 = a5 || a5; // void || void is void
var re6 = a6 || a5; // enum || void is {}
var re7 = a7 || a5; // object || void is {}
var re8 = a8 || a5; // array || void is {}
var re6 = a6 || a5; // enum || void is enum | void
var re7 = a7 || a5; // object || void is object | void
var re8 = a8 || a5; // array || void is array | void
var re9 = null || a5; // null || void is void
var re10 = undefined || a5; // undefined || void is void
var rg1 = a1 || a6; // any || enum is any
var rg2 = a2 || a6; // boolean || enum is {}
var rg2 = a2 || a6; // boolean || enum is boolean | enum
var rg3 = a3 || a6; // number || enum is number
var rg4 = a4 || a6; // string || enum is {}
var rg5 = a5 || a6; // void || enum is {}
var rg4 = a4 || a6; // string || enum is string | enum
var rg5 = a5 || a6; // void || enum is void | enum
var rg6 = a6 || a6; // enum || enum is E
var rg7 = a7 || a6; // object || enum is {}
var rg8 = a8 || a6; // array || enum is {}
var rg7 = a7 || a6; // object || enum is object | enum
var rg8 = a8 || a6; // array || enum is array | enum
var rg9 = null || a6; // null || enum is E
var rg10 = undefined || a6; // undefined || enum is E
var rh1 = a1 || a7; // any || object is any
var rh2 = a2 || a7; // boolean || object is {}
var rh3 = a3 || a7; // number || object is {}
var rh4 = a4 || a7; // string || object is {}
var rh5 = a5 || a7; // void || object is {}
var rh6 = a6 || a7; // enum || object is {}
var rh2 = a2 || a7; // boolean || object is boolean | object
var rh3 = a3 || a7; // number || object is number | object
var rh4 = a4 || a7; // string || object is string | object
var rh5 = a5 || a7; // void || object is void | object
var rh6 = a6 || a7; // enum || object is enum | object
var rh7 = a7 || a7; // object || object is object
var rh8 = a8 || a7; // array || object is {}
var rh8 = a8 || a7; // array || object is array | object
var rh9 = null || a7; // null || object is object
var rh10 = undefined || a7; // undefined || object is object
var ri1 = a1 || a8; // any || array is any
var ri2 = a2 || a8; // boolean || array is {}
var ri3 = a3 || a8; // number || array is {}
var ri4 = a4 || a8; // string || array is {}
var ri5 = a5 || a8; // void || array is {}
var ri6 = a6 || a8; // enum || array is {}
var ri7 = a7 || a8; // object || array is {}
var ri2 = a2 || a8; // boolean || array is boolean | array
var ri3 = a3 || a8; // number || array is number | array
var ri4 = a4 || a8; // string || array is string | array
var ri5 = a5 || a8; // void || array is void | array
var ri6 = a6 || a8; // enum || array is enum | array
var ri7 = a7 || a8; // object || array is object | array
var ri8 = a8 || a8; // array || array is array
var ri9 = null || a8; // null || array is array
var ri10 = undefined || a8; // undefined || array is array
@@ -156,71 +156,71 @@ var ra9 = null || a1; // null || any is any
var ra10 = undefined || a1; // undefined || any is any
var rb1 = a1 || a2; // any || boolean is any
var rb2 = a2 || a2; // boolean || boolean is boolean
var rb3 = a3 || a2; // number || boolean is {}
var rb4 = a4 || a2; // string || boolean is {}
var rb5 = a5 || a2; // void || boolean is {}
var rb6 = a6 || a2; // enum || boolean is {}
var rb7 = a7 || a2; // object || boolean is {}
var rb8 = a8 || a2; // array || boolean is {}
var rb3 = a3 || a2; // number || boolean is number | boolean
var rb4 = a4 || a2; // string || boolean is string | boolean
var rb5 = a5 || a2; // void || boolean is void | boolean
var rb6 = a6 || a2; // enum || boolean is E | boolean
var rb7 = a7 || a2; // object || boolean is object | boolean
var rb8 = a8 || a2; // array || boolean is array | boolean
var rb9 = null || a2; // null || boolean is boolean
var rb10 = undefined || a2; // undefined || boolean is boolean
var rc1 = a1 || a3; // any || number is any
var rc2 = a2 || a3; // boolean || number is {}
var rc2 = a2 || a3; // boolean || number is boolean | number
var rc3 = a3 || a3; // number || number is number
var rc4 = a4 || a3; // string || number is {}
var rc5 = a5 || a3; // void || number is {}
var rc4 = a4 || a3; // string || number is string | number
var rc5 = a5 || a3; // void || number is void | number
var rc6 = a6 || a3; // enum || number is number
var rc7 = a7 || a3; // object || number is {}
var rc8 = a8 || a3; // array || number is {}
var rc7 = a7 || a3; // object || number is object | number
var rc8 = a8 || a3; // array || number is array | number
var rc9 = null || a3; // null || number is number
var rc10 = undefined || a3; // undefined || number is number
var rd1 = a1 || a4; // any || string is any
var rd2 = a2 || a4; // boolean || string is {}
var rd3 = a3 || a4; // number || string is {}
var rd2 = a2 || a4; // boolean || string is boolean | string
var rd3 = a3 || a4; // number || string is number | string
var rd4 = a4 || a4; // string || string is string
var rd5 = a5 || a4; // void || string is {}
var rd6 = a6 || a4; // enum || string is {}
var rd7 = a7 || a4; // object || string is {}
var rd8 = a8 || a4; // array || string is {}
var rd5 = a5 || a4; // void || string is void | string
var rd6 = a6 || a4; // enum || string is enum | string
var rd7 = a7 || a4; // object || string is object | string
var rd8 = a8 || a4; // array || string is array | string
var rd9 = null || a4; // null || string is string
var rd10 = undefined || a4; // undefined || string is string
var re1 = a1 || a5; // any || void is any
var re2 = a2 || a5; // boolean || void is {}
var re3 = a3 || a5; // number || void is {}
var re4 = a4 || a5; // string || void is {}
var re2 = a2 || a5; // boolean || void is boolean | void
var re3 = a3 || a5; // number || void is number | void
var re4 = a4 || a5; // string || void is string | void
var re5 = a5 || a5; // void || void is void
var re6 = a6 || a5; // enum || void is {}
var re7 = a7 || a5; // object || void is {}
var re8 = a8 || a5; // array || void is {}
var re6 = a6 || a5; // enum || void is enum | void
var re7 = a7 || a5; // object || void is object | void
var re8 = a8 || a5; // array || void is array | void
var re9 = null || a5; // null || void is void
var re10 = undefined || a5; // undefined || void is void
var rg1 = a1 || a6; // any || enum is any
var rg2 = a2 || a6; // boolean || enum is {}
var rg2 = a2 || a6; // boolean || enum is boolean | enum
var rg3 = a3 || a6; // number || enum is number
var rg4 = a4 || a6; // string || enum is {}
var rg5 = a5 || a6; // void || enum is {}
var rg4 = a4 || a6; // string || enum is string | enum
var rg5 = a5 || a6; // void || enum is void | enum
var rg6 = a6 || a6; // enum || enum is E
var rg7 = a7 || a6; // object || enum is {}
var rg8 = a8 || a6; // array || enum is {}
var rg7 = a7 || a6; // object || enum is object | enum
var rg8 = a8 || a6; // array || enum is array | enum
var rg9 = null || a6; // null || enum is E
var rg10 = undefined || a6; // undefined || enum is E
var rh1 = a1 || a7; // any || object is any
var rh2 = a2 || a7; // boolean || object is {}
var rh3 = a3 || a7; // number || object is {}
var rh4 = a4 || a7; // string || object is {}
var rh5 = a5 || a7; // void || object is {}
var rh6 = a6 || a7; // enum || object is {}
var rh2 = a2 || a7; // boolean || object is boolean | object
var rh3 = a3 || a7; // number || object is number | object
var rh4 = a4 || a7; // string || object is string | object
var rh5 = a5 || a7; // void || object is void | object
var rh6 = a6 || a7; // enum || object is enum | object
var rh7 = a7 || a7; // object || object is object
var rh8 = a8 || a7; // array || object is {}
var rh8 = a8 || a7; // array || object is array | object
var rh9 = null || a7; // null || object is object
var rh10 = undefined || a7; // undefined || object is object
var ri1 = a1 || a8; // any || array is any
var ri2 = a2 || a8; // boolean || array is {}
var ri3 = a3 || a8; // number || array is {}
var ri4 = a4 || a8; // string || array is {}
var ri5 = a5 || a8; // void || array is {}
var ri6 = a6 || a8; // enum || array is {}
var ri7 = a7 || a8; // object || array is {}
var ri2 = a2 || a8; // boolean || array is boolean | array
var ri3 = a3 || a8; // number || array is number | array
var ri4 = a4 || a8; // string || array is string | array
var ri5 = a5 || a8; // void || array is void | array
var ri6 = a6 || a8; // enum || array is enum | array
var ri7 = a7 || a8; // object || array is object | array
var ri8 = a8 || a8; // array || array is array
var ri9 = null || a8; // null || array is array
var ri10 = undefined || a8; // undefined || array is array
@@ -107,37 +107,37 @@ var rb2 = a2 || a2; // boolean || boolean is boolean
>a2 : boolean
>a2 : boolean
var rb3 = a3 || a2; // number || boolean is {}
var rb3 = a3 || a2; // number || boolean is number | boolean
>rb3 : number | boolean
>a3 || a2 : number | boolean
>a3 : number
>a2 : boolean
var rb4 = a4 || a2; // string || boolean is {}
var rb4 = a4 || a2; // string || boolean is string | boolean
>rb4 : string | boolean
>a4 || a2 : string | boolean
>a4 : string
>a2 : boolean
var rb5 = a5 || a2; // void || boolean is {}
var rb5 = a5 || a2; // void || boolean is void | boolean
>rb5 : boolean | void
>a5 || a2 : boolean | void
>a5 : void
>a2 : boolean
var rb6 = a6 || a2; // enum || boolean is {}
var rb6 = a6 || a2; // enum || boolean is E | boolean
>rb6 : boolean | E
>a6 || a2 : boolean | E
>a6 : E
>a2 : boolean
var rb7 = a7 || a2; // object || boolean is {}
var rb7 = a7 || a2; // object || boolean is object | boolean
>rb7 : boolean | { a: string; }
>a7 || a2 : boolean | { a: string; }
>a7 : { a: string; }
>a2 : boolean
var rb8 = a8 || a2; // array || boolean is {}
var rb8 = a8 || a2; // array || boolean is array | boolean
>rb8 : boolean | string[]
>a8 || a2 : boolean | string[]
>a8 : string[]
@@ -160,7 +160,7 @@ var rc1 = a1 || a3; // any || number is any
>a1 : any
>a3 : number
var rc2 = a2 || a3; // boolean || number is {}
var rc2 = a2 || a3; // boolean || number is boolean | number
>rc2 : number | boolean
>a2 || a3 : number | boolean
>a2 : boolean
@@ -172,13 +172,13 @@ var rc3 = a3 || a3; // number || number is number
>a3 : number
>a3 : number
var rc4 = a4 || a3; // string || number is {}
var rc4 = a4 || a3; // string || number is string | number
>rc4 : string | number
>a4 || a3 : string | number
>a4 : string
>a3 : number
var rc5 = a5 || a3; // void || number is {}
var rc5 = a5 || a3; // void || number is void | number
>rc5 : number | void
>a5 || a3 : number | void
>a5 : void
@@ -190,13 +190,13 @@ var rc6 = a6 || a3; // enum || number is number
>a6 : E
>a3 : number
var rc7 = a7 || a3; // object || number is {}
var rc7 = a7 || a3; // object || number is object | number
>rc7 : number | { a: string; }
>a7 || a3 : number | { a: string; }
>a7 : { a: string; }
>a3 : number
var rc8 = a8 || a3; // array || number is {}
var rc8 = a8 || a3; // array || number is array | number
>rc8 : number | string[]
>a8 || a3 : number | string[]
>a8 : string[]
@@ -219,13 +219,13 @@ var rd1 = a1 || a4; // any || string is any
>a1 : any
>a4 : string
var rd2 = a2 || a4; // boolean || string is {}
var rd2 = a2 || a4; // boolean || string is boolean | string
>rd2 : string | boolean
>a2 || a4 : string | boolean
>a2 : boolean
>a4 : string
var rd3 = a3 || a4; // number || string is {}
var rd3 = a3 || a4; // number || string is number | string
>rd3 : string | number
>a3 || a4 : string | number
>a3 : number
@@ -237,25 +237,25 @@ var rd4 = a4 || a4; // string || string is string
>a4 : string
>a4 : string
var rd5 = a5 || a4; // void || string is {}
var rd5 = a5 || a4; // void || string is void | string
>rd5 : string | void
>a5 || a4 : string | void
>a5 : void
>a4 : string
var rd6 = a6 || a4; // enum || string is {}
var rd6 = a6 || a4; // enum || string is enum | string
>rd6 : string | E
>a6 || a4 : string | E
>a6 : E
>a4 : string
var rd7 = a7 || a4; // object || string is {}
var rd7 = a7 || a4; // object || string is object | string
>rd7 : string | { a: string; }
>a7 || a4 : string | { a: string; }
>a7 : { a: string; }
>a4 : string
var rd8 = a8 || a4; // array || string is {}
var rd8 = a8 || a4; // array || string is array | string
>rd8 : string | string[]
>a8 || a4 : string | string[]
>a8 : string[]
@@ -278,19 +278,19 @@ var re1 = a1 || a5; // any || void is any
>a1 : any
>a5 : void
var re2 = a2 || a5; // boolean || void is {}
var re2 = a2 || a5; // boolean || void is boolean | void
>re2 : boolean | void
>a2 || a5 : boolean | void
>a2 : boolean
>a5 : void
var re3 = a3 || a5; // number || void is {}
var re3 = a3 || a5; // number || void is number | void
>re3 : number | void
>a3 || a5 : number | void
>a3 : number
>a5 : void
var re4 = a4 || a5; // string || void is {}
var re4 = a4 || a5; // string || void is string | void
>re4 : string | void
>a4 || a5 : string | void
>a4 : string
@@ -302,19 +302,19 @@ var re5 = a5 || a5; // void || void is void
>a5 : void
>a5 : void
var re6 = a6 || a5; // enum || void is {}
var re6 = a6 || a5; // enum || void is enum | void
>re6 : void | E
>a6 || a5 : void | E
>a6 : E
>a5 : void
var re7 = a7 || a5; // object || void is {}
var re7 = a7 || a5; // object || void is object | void
>re7 : void | { a: string; }
>a7 || a5 : void | { a: string; }
>a7 : { a: string; }
>a5 : void
var re8 = a8 || a5; // array || void is {}
var re8 = a8 || a5; // array || void is array | void
>re8 : void | string[]
>a8 || a5 : void | string[]
>a8 : string[]
@@ -337,7 +337,7 @@ var rg1 = a1 || a6; // any || enum is any
>a1 : any
>a6 : E
var rg2 = a2 || a6; // boolean || enum is {}
var rg2 = a2 || a6; // boolean || enum is boolean | enum
>rg2 : boolean | E
>a2 || a6 : boolean | E
>a2 : boolean
@@ -349,13 +349,13 @@ var rg3 = a3 || a6; // number || enum is number
>a3 : number
>a6 : E
var rg4 = a4 || a6; // string || enum is {}
var rg4 = a4 || a6; // string || enum is string | enum
>rg4 : string | E
>a4 || a6 : string | E
>a4 : string
>a6 : E
var rg5 = a5 || a6; // void || enum is {}
var rg5 = a5 || a6; // void || enum is void | enum
>rg5 : void | E
>a5 || a6 : void | E
>a5 : void
@@ -367,13 +367,13 @@ var rg6 = a6 || a6; // enum || enum is E
>a6 : E
>a6 : E
var rg7 = a7 || a6; // object || enum is {}
var rg7 = a7 || a6; // object || enum is object | enum
>rg7 : E | { a: string; }
>a7 || a6 : E | { a: string; }
>a7 : { a: string; }
>a6 : E
var rg8 = a8 || a6; // array || enum is {}
var rg8 = a8 || a6; // array || enum is array | enum
>rg8 : string[] | E
>a8 || a6 : string[] | E
>a8 : string[]
@@ -396,31 +396,31 @@ var rh1 = a1 || a7; // any || object is any
>a1 : any
>a7 : { a: string; }
var rh2 = a2 || a7; // boolean || object is {}
var rh2 = a2 || a7; // boolean || object is boolean | object
>rh2 : boolean | { a: string; }
>a2 || a7 : boolean | { a: string; }
>a2 : boolean
>a7 : { a: string; }
var rh3 = a3 || a7; // number || object is {}
var rh3 = a3 || a7; // number || object is number | object
>rh3 : number | { a: string; }
>a3 || a7 : number | { a: string; }
>a3 : number
>a7 : { a: string; }
var rh4 = a4 || a7; // string || object is {}
var rh4 = a4 || a7; // string || object is string | object
>rh4 : string | { a: string; }
>a4 || a7 : string | { a: string; }
>a4 : string
>a7 : { a: string; }
var rh5 = a5 || a7; // void || object is {}
var rh5 = a5 || a7; // void || object is void | object
>rh5 : void | { a: string; }
>a5 || a7 : void | { a: string; }
>a5 : void
>a7 : { a: string; }
var rh6 = a6 || a7; // enum || object is {}
var rh6 = a6 || a7; // enum || object is enum | object
>rh6 : E | { a: string; }
>a6 || a7 : E | { a: string; }
>a6 : E
@@ -432,7 +432,7 @@ var rh7 = a7 || a7; // object || object is object
>a7 : { a: string; }
>a7 : { a: string; }
var rh8 = a8 || a7; // array || object is {}
var rh8 = a8 || a7; // array || object is array | object
>rh8 : string[] | { a: string; }
>a8 || a7 : string[] | { a: string; }
>a8 : string[]
@@ -455,37 +455,37 @@ var ri1 = a1 || a8; // any || array is any
>a1 : any
>a8 : string[]
var ri2 = a2 || a8; // boolean || array is {}
var ri2 = a2 || a8; // boolean || array is boolean | array
>ri2 : boolean | string[]
>a2 || a8 : boolean | string[]
>a2 : boolean
>a8 : string[]
var ri3 = a3 || a8; // number || array is {}
var ri3 = a3 || a8; // number || array is number | array
>ri3 : number | string[]
>a3 || a8 : number | string[]
>a3 : number
>a8 : string[]
var ri4 = a4 || a8; // string || array is {}
var ri4 = a4 || a8; // string || array is string | array
>ri4 : string | string[]
>a4 || a8 : string | string[]
>a4 : string
>a8 : string[]
var ri5 = a5 || a8; // void || array is {}
var ri5 = a5 || a8; // void || array is void | array
>ri5 : void | string[]
>a5 || a8 : void | string[]
>a5 : void
>a8 : string[]
var ri6 = a6 || a8; // enum || array is {}
var ri6 = a6 || a8; // enum || array is enum | array
>ri6 : string[] | E
>a6 || a8 : string[] | E
>a6 : E
>a8 : string[]
var ri7 = a7 || a8; // object || array is {}
var ri7 = a7 || a8; // object || array is object | array
>ri7 : string[] | { a: string; }
>a7 || a8 : string[] | { a: string; }
>a7 : { a: string; }
@@ -0,0 +1,142 @@
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(16,5): error TS2411: Property 'foo4' of type 'boolean' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(18,5): error TS2411: Property 'foo6' of type 'Date' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(19,5): error TS2411: Property 'foo7' of type 'RegExp' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(20,5): error TS2411: Property 'foo8' of type '{ bar: number; }' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(21,5): error TS2411: Property 'foo9' of type 'I8' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(22,5): error TS2411: Property 'foo10' of type 'A' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(23,5): error TS2411: Property 'foo11' of type 'A2<number>' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(24,5): error TS2411: Property 'foo12' of type '(x: any) => number' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(25,5): error TS2411: Property 'foo13' of type '<T>(x: T) => T' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(26,5): error TS2411: Property 'foo14' of type 'typeof f' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(27,5): error TS2411: Property 'foo15' of type 'typeof c' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(28,5): error TS2411: Property 'foo16' of type 'T' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(29,5): error TS2411: Property 'foo17' of type 'Object' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(30,5): error TS2411: Property 'foo18' of type '{}' is not assignable to string index type 'string | number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(35,5): error TS2411: Property 'foo2' of type 'string' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(37,5): error TS2411: Property 'foo4' of type 'boolean' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(39,5): error TS2411: Property 'foo6' of type 'Date' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(40,5): error TS2411: Property 'foo7' of type 'RegExp' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(41,5): error TS2411: Property 'foo8' of type '{ bar: number; }' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(42,5): error TS2411: Property 'foo9' of type 'I8' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(43,5): error TS2411: Property 'foo10' of type 'A' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(44,5): error TS2411: Property 'foo11' of type 'A2<number>' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(45,5): error TS2411: Property 'foo12' of type '(x: any) => number' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(46,5): error TS2411: Property 'foo13' of type '<T>(x: T) => T' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(47,5): error TS2411: Property 'foo14' of type 'typeof f' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(48,5): error TS2411: Property 'foo15' of type 'typeof c' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(49,5): error TS2411: Property 'foo16' of type 'T' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(50,5): error TS2411: Property 'foo17' of type 'Object' is not assignable to string index type 'number | E'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts(51,5): error TS2411: Property 'foo18' of type '{}' is not assignable to string index type 'number | E'.
==== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfUnion.ts (29 errors) ====
enum E { e1, e2 }
interface I8 { [x: string]: number[]; }
class A { foo: number; }
class A2<T> { foo: T; }
function f() { }
module f { export var bar = 1; }
class c { baz: string }
module c { export var bar = 1; }
// A type T is a subtype of a union type U if T is a subtype of any type in U.
interface I1<T> {
[x: string]: string | number;
foo: any; // ok
foo2: string; // ok
foo3: number; // ok
foo4: boolean; // error
~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo4' of type 'boolean' is not assignable to string index type 'string | number'.
foo5: E; // ok - subtype of number
foo6: Date; // error
~~~~~~~~~~~
!!! error TS2411: Property 'foo6' of type 'Date' is not assignable to string index type 'string | number'.
foo7: RegExp; // error
~~~~~~~~~~~~~
!!! error TS2411: Property 'foo7' of type 'RegExp' is not assignable to string index type 'string | number'.
foo8: { bar: number }; // error
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo8' of type '{ bar: number; }' is not assignable to string index type 'string | number'.
foo9: I8; // error
~~~~~~~~~
!!! error TS2411: Property 'foo9' of type 'I8' is not assignable to string index type 'string | number'.
foo10: A; // error
~~~~~~~~~
!!! error TS2411: Property 'foo10' of type 'A' is not assignable to string index type 'string | number'.
foo11: A2<number>; // error
~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo11' of type 'A2<number>' is not assignable to string index type 'string | number'.
foo12: (x) => number; //error
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo12' of type '(x: any) => number' is not assignable to string index type 'string | number'.
foo13: <T>(x: T) => T; // error
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo13' of type '<T>(x: T) => T' is not assignable to string index type 'string | number'.
foo14: typeof f; // error
~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo14' of type 'typeof f' is not assignable to string index type 'string | number'.
foo15: typeof c; // error
~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo15' of type 'typeof c' is not assignable to string index type 'string | number'.
foo16: T; // error
~~~~~~~~~
!!! error TS2411: Property 'foo16' of type 'T' is not assignable to string index type 'string | number'.
foo17: Object; // error
~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo17' of type 'Object' is not assignable to string index type 'string | number'.
foo18: {}; // error
~~~~~~~~~~
!!! error TS2411: Property 'foo18' of type '{}' is not assignable to string index type 'string | number'.
}
interface I2<T> {
[x: string]: E | number;
foo: any; // ok
foo2: string; // error
~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'string' is not assignable to string index type 'number | E'.
foo3: number; // ok
foo4: boolean; // error
~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo4' of type 'boolean' is not assignable to string index type 'number | E'.
foo5: E; // ok
foo6: Date; // error
~~~~~~~~~~~
!!! error TS2411: Property 'foo6' of type 'Date' is not assignable to string index type 'number | E'.
foo7: RegExp; // error
~~~~~~~~~~~~~
!!! error TS2411: Property 'foo7' of type 'RegExp' is not assignable to string index type 'number | E'.
foo8: { bar: number }; // error
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo8' of type '{ bar: number; }' is not assignable to string index type 'number | E'.
foo9: I8; // error
~~~~~~~~~
!!! error TS2411: Property 'foo9' of type 'I8' is not assignable to string index type 'number | E'.
foo10: A; // error
~~~~~~~~~
!!! error TS2411: Property 'foo10' of type 'A' is not assignable to string index type 'number | E'.
foo11: A2<number>; // error
~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo11' of type 'A2<number>' is not assignable to string index type 'number | E'.
foo12: (x) => number; //error
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo12' of type '(x: any) => number' is not assignable to string index type 'number | E'.
foo13: <T>(x: T) => T; // error
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo13' of type '<T>(x: T) => T' is not assignable to string index type 'number | E'.
foo14: typeof f; // error
~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo14' of type 'typeof f' is not assignable to string index type 'number | E'.
foo15: typeof c; // error
~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo15' of type 'typeof c' is not assignable to string index type 'number | E'.
foo16: T; // error
~~~~~~~~~
!!! error TS2411: Property 'foo16' of type 'T' is not assignable to string index type 'number | E'.
foo17: Object; // error
~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo17' of type 'Object' is not assignable to string index type 'number | E'.
foo18: {}; // error
~~~~~~~~~~
!!! error TS2411: Property 'foo18' of type '{}' is not assignable to string index type 'number | E'.
}
@@ -0,0 +1,85 @@
//// [subtypesOfUnion.ts]
enum E { e1, e2 }
interface I8 { [x: string]: number[]; }
class A { foo: number; }
class A2<T> { foo: T; }
function f() { }
module f { export var bar = 1; }
class c { baz: string }
module c { export var bar = 1; }
// A type T is a subtype of a union type U if T is a subtype of any type in U.
interface I1<T> {
[x: string]: string | number;
foo: any; // ok
foo2: string; // ok
foo3: number; // ok
foo4: boolean; // error
foo5: E; // ok - subtype of number
foo6: Date; // error
foo7: RegExp; // error
foo8: { bar: number }; // error
foo9: I8; // error
foo10: A; // error
foo11: A2<number>; // error
foo12: (x) => number; //error
foo13: <T>(x: T) => T; // error
foo14: typeof f; // error
foo15: typeof c; // error
foo16: T; // error
foo17: Object; // error
foo18: {}; // error
}
interface I2<T> {
[x: string]: E | number;
foo: any; // ok
foo2: string; // error
foo3: number; // ok
foo4: boolean; // error
foo5: E; // ok
foo6: Date; // error
foo7: RegExp; // error
foo8: { bar: number }; // error
foo9: I8; // error
foo10: A; // error
foo11: A2<number>; // error
foo12: (x) => number; //error
foo13: <T>(x: T) => T; // error
foo14: typeof f; // error
foo15: typeof c; // error
foo16: T; // error
foo17: Object; // error
foo18: {}; // error
}
//// [subtypesOfUnion.js]
var E;
(function (E) {
E[E["e1"] = 0] = "e1";
E[E["e2"] = 1] = "e2";
})(E || (E = {}));
var A = (function () {
function A() {
}
return A;
})();
var A2 = (function () {
function A2() {
}
return A2;
})();
function f() {
}
var f;
(function (f) {
f.bar = 1;
})(f || (f = {}));
var c = (function () {
function c() {
}
return c;
})();
var c;
(function (c) {
c.bar = 1;
})(c || (c = {}));
@@ -0,0 +1,239 @@
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(15,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(21,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'string'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(22,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'string'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(28,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'boolean'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(29,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'boolean'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(35,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'Date'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(36,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'Date'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(42,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'RegExp'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(43,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'RegExp'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(49,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '{ bar: number; }'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(50,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '{ bar: number; }'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(56,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number[]'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(57,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'number[]'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(63,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'I8'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(64,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'I8'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(70,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(71,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(77,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A2<number>'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(78,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A2<number>'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(84,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '(x: any) => number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(85,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '(x: any) => number'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(91,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '<T>(x: T) => T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(92,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '<T>(x: T) => T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(99,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'E2'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(100,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'E2'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(110,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof f'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(111,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof f'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(121,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof c'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(122,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof c'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(128,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'T'.
tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(129,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'T'.
==== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts (31 errors) ====
enum e {
e1,
e2
}
// A union type U is a subtype of a type T if each type in U is a subtype of T
interface I {
[x: string]: any;
foo: string | number; // ok
foo2: e | number; // ok
}
interface I2 {
[x: string]: number;
// S is union type and each constituent type of S is a subtype of T
foo: string | number; // error string is not subtype of number
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number'.
foo2: e | number; // ok e and number both subtype of number
}
interface I3 {
[x: string]: string;
foo: string | number; // error numer is not subtype of string
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'string'.
foo2: e | number; // error e and number both not subtype of string
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'string'.
}
// error cases
interface I4 {
[x: string]: boolean;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'boolean'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'boolean'.
}
interface I5 {
[x: string]: Date;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'Date'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'Date'.
}
interface I6 {
[x: string]: RegExp;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'RegExp'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'RegExp'.
}
interface I7 {
[x: string]: { bar: number };
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '{ bar: number; }'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '{ bar: number; }'.
}
interface I8 {
[x: string]: number[];
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number[]'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'number[]'.
}
interface I9 {
[x: string]: I8;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'I8'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'I8'.
}
class A { foo: number; }
interface I10 {
[x: string]: A;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A'.
}
class A2<T> { foo: T; }
interface I11 {
[x: string]: A2<number>;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A2<number>'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A2<number>'.
}
interface I12 {
[x: string]: (x) => number;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '(x: any) => number'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '(x: any) => number'.
}
interface I13 {
[x: string]: <T>(x: T) => T;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '<T>(x: T) => T'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '<T>(x: T) => T'.
}
enum E2 { A }
interface I14 {
[x: string]: E2;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'E2'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'E2'.
}
function f() { }
module f {
export var bar = 1;
}
interface I15 {
[x: string]: typeof f;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof f'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof f'.
}
class c { baz: string }
module c {
export var bar = 1;
}
interface I16 {
[x: string]: typeof c;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof c'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof c'.
}
interface I17<T> {
[x: string]: T;
foo: string | number;
~~~~~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'T'.
foo2: e | number;
~~~~~~~~~~~~~~~~~
!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'T'.
}
interface I19 {
[x: string]: Object;
foo: string | number;
foo2: e | number;
}
interface I20 {
[x: string]: {};
foo: string | number;
foo2: e | number;
}
@@ -0,0 +1,180 @@
//// [unionSubtypeIfEveryConstituentTypeIsSubtype.ts]
enum e {
e1,
e2
}
// A union type U is a subtype of a type T if each type in U is a subtype of T
interface I {
[x: string]: any;
foo: string | number; // ok
foo2: e | number; // ok
}
interface I2 {
[x: string]: number;
// S is union type and each constituent type of S is a subtype of T
foo: string | number; // error string is not subtype of number
foo2: e | number; // ok e and number both subtype of number
}
interface I3 {
[x: string]: string;
foo: string | number; // error numer is not subtype of string
foo2: e | number; // error e and number both not subtype of string
}
// error cases
interface I4 {
[x: string]: boolean;
foo: string | number;
foo2: e | number;
}
interface I5 {
[x: string]: Date;
foo: string | number;
foo2: e | number;
}
interface I6 {
[x: string]: RegExp;
foo: string | number;
foo2: e | number;
}
interface I7 {
[x: string]: { bar: number };
foo: string | number;
foo2: e | number;
}
interface I8 {
[x: string]: number[];
foo: string | number;
foo2: e | number;
}
interface I9 {
[x: string]: I8;
foo: string | number;
foo2: e | number;
}
class A { foo: number; }
interface I10 {
[x: string]: A;
foo: string | number;
foo2: e | number;
}
class A2<T> { foo: T; }
interface I11 {
[x: string]: A2<number>;
foo: string | number;
foo2: e | number;
}
interface I12 {
[x: string]: (x) => number;
foo: string | number;
foo2: e | number;
}
interface I13 {
[x: string]: <T>(x: T) => T;
foo: string | number;
foo2: e | number;
}
enum E2 { A }
interface I14 {
[x: string]: E2;
foo: string | number;
foo2: e | number;
}
function f() { }
module f {
export var bar = 1;
}
interface I15 {
[x: string]: typeof f;
foo: string | number;
foo2: e | number;
}
class c { baz: string }
module c {
export var bar = 1;
}
interface I16 {
[x: string]: typeof c;
foo: string | number;
foo2: e | number;
}
interface I17<T> {
[x: string]: T;
foo: string | number;
foo2: e | number;
}
interface I19 {
[x: string]: Object;
foo: string | number;
foo2: e | number;
}
interface I20 {
[x: string]: {};
foo: string | number;
foo2: e | number;
}
//// [unionSubtypeIfEveryConstituentTypeIsSubtype.js]
var e;
(function (e) {
e[e["e1"] = 0] = "e1";
e[e["e2"] = 1] = "e2";
})(e || (e = {}));
var A = (function () {
function A() {
}
return A;
})();
var A2 = (function () {
function A2() {
}
return A2;
})();
var E2;
(function (E2) {
E2[E2["A"] = 0] = "A";
})(E2 || (E2 = {}));
function f() {
}
var f;
(function (f) {
f.bar = 1;
})(f || (f = {}));
var c = (function () {
function c() {
}
return c;
})();
var c;
(function (c) {
c.bar = 1;
})(c || (c = {}));
@@ -0,0 +1,178 @@
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(9,43): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(10,29): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(15,29): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(16,1): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(19,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(20,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(21,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(24,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(25,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(26,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(29,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(30,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(31,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(36,49): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(37,12): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(40,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(41,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(42,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(43,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(46,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(47,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(48,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(49,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(55,45): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(56,12): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(59,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(60,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(61,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(62,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(63,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(66,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(67,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(68,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(69,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeCallSignatures.ts(70,12): error TS2349: Cannot invoke an expression whose type lacks a call signature.
==== tests/cases/conformance/types/union/unionTypeCallSignatures.ts (35 errors) ====
var numOrDate: number | Date;
var strOrBoolean: string | boolean;
var strOrNum: string | number;
// If each type in U has call signatures and the sets of call signatures are identical ignoring return types,
// U has the same set of call signatures, but with return types that are unions of the return types of the respective call signatures from each type in U.
var unionOfDifferentReturnType: { (a: number): number; } | { (a: number): Date; };
numOrDate = unionOfDifferentReturnType(10);
strOrBoolean = unionOfDifferentReturnType("hello"); // error
~~~~~~~
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
unionOfDifferentReturnType1(true); // error in type of parameter
~~~~
!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
var unionOfDifferentReturnType1: { (a: number): number; (a: string): string; } | { (a: number): Date; (a: string): boolean; };
numOrDate = unionOfDifferentReturnType1(10);
strOrBoolean = unionOfDifferentReturnType1("hello");
unionOfDifferentReturnType1(true); // error in type of parameter
~~~~
!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
unionOfDifferentReturnType1(); // error missing parameter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
var unionOfDifferentParameterTypes: { (a: number): number; } | { (a: string): Date; };
unionOfDifferentParameterTypes(10);// error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
unionOfDifferentParameterTypes("hello");// error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
unionOfDifferentParameterTypes();// error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
var unionOfDifferentNumberOfSignatures: { (a: number): number; } | { (a: number): Date; (a: string): boolean; };
unionOfDifferentNumberOfSignatures(); // error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
unionOfDifferentNumberOfSignatures(10); // error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
var unionWithDifferentParameterCount: { (a: string): string; } | { (a: string, b: number): number; } ;
unionWithDifferentParameterCount();// no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
unionWithDifferentParameterCount("hello");// no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
unionWithDifferentParameterCount("hello", 10);// no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
var unionWithOptionalParameter1: { (a: string, b?: number): string; } | { (a: string, b?: number): number; };
strOrNum = unionWithOptionalParameter1('hello');
strOrNum = unionWithOptionalParameter1('hello', 10);
strOrNum = unionWithOptionalParameter1('hello', "hello"); // error in parameter type
~~~~~~~
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
strOrNum = unionWithOptionalParameter1(); // error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
var unionWithOptionalParameter2: { (a: string, b?: number): string; } | { (a: string, b: number): number };
strOrNum = unionWithOptionalParameter2('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithOptionalParameter2('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithOptionalParameter2('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithOptionalParameter2(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
var unionWithOptionalParameter3: { (a: string, b?: number): string; } | { (a: string): number; };
strOrNum = unionWithOptionalParameter3('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithOptionalParameter3('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithOptionalParameter3('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithOptionalParameter3(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
var unionWithRestParameter1: { (a: string, ...b: number[]): string; } | { (a: string, ...b: number[]): number };
strOrNum = unionWithRestParameter1('hello');
strOrNum = unionWithRestParameter1('hello', 10);
strOrNum = unionWithRestParameter1('hello', 10, 11);
strOrNum = unionWithRestParameter1('hello', "hello"); // error in parameter type
~~~~~~~
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
strOrNum = unionWithRestParameter1(); // error
~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
var unionWithRestParameter2: { (a: string, ...b: number[]): string; } | { (a: string, b: number): number };
strOrNum = unionWithRestParameter2('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter2('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter2('hello', 10, 11); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter2('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter2(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
var unionWithRestParameter3: { (a: string, ...b: number[]): string; } | { (a: string): number };
strOrNum = unionWithRestParameter3('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter3('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter3('hello', 10, 11); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter3('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
strOrNum = unionWithRestParameter3(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
@@ -0,0 +1,132 @@
//// [unionTypeCallSignatures.ts]
var numOrDate: number | Date;
var strOrBoolean: string | boolean;
var strOrNum: string | number;
// If each type in U has call signatures and the sets of call signatures are identical ignoring return types,
// U has the same set of call signatures, but with return types that are unions of the return types of the respective call signatures from each type in U.
var unionOfDifferentReturnType: { (a: number): number; } | { (a: number): Date; };
numOrDate = unionOfDifferentReturnType(10);
strOrBoolean = unionOfDifferentReturnType("hello"); // error
unionOfDifferentReturnType1(true); // error in type of parameter
var unionOfDifferentReturnType1: { (a: number): number; (a: string): string; } | { (a: number): Date; (a: string): boolean; };
numOrDate = unionOfDifferentReturnType1(10);
strOrBoolean = unionOfDifferentReturnType1("hello");
unionOfDifferentReturnType1(true); // error in type of parameter
unionOfDifferentReturnType1(); // error missing parameter
var unionOfDifferentParameterTypes: { (a: number): number; } | { (a: string): Date; };
unionOfDifferentParameterTypes(10);// error - no call signatures
unionOfDifferentParameterTypes("hello");// error - no call signatures
unionOfDifferentParameterTypes();// error - no call signatures
var unionOfDifferentNumberOfSignatures: { (a: number): number; } | { (a: number): Date; (a: string): boolean; };
unionOfDifferentNumberOfSignatures(); // error - no call signatures
unionOfDifferentNumberOfSignatures(10); // error - no call signatures
unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
var unionWithDifferentParameterCount: { (a: string): string; } | { (a: string, b: number): number; } ;
unionWithDifferentParameterCount();// no call signature
unionWithDifferentParameterCount("hello");// no call signature
unionWithDifferentParameterCount("hello", 10);// no call signature
var unionWithOptionalParameter1: { (a: string, b?: number): string; } | { (a: string, b?: number): number; };
strOrNum = unionWithOptionalParameter1('hello');
strOrNum = unionWithOptionalParameter1('hello', 10);
strOrNum = unionWithOptionalParameter1('hello', "hello"); // error in parameter type
strOrNum = unionWithOptionalParameter1(); // error
var unionWithOptionalParameter2: { (a: string, b?: number): string; } | { (a: string, b: number): number };
strOrNum = unionWithOptionalParameter2('hello'); // error no call signature
strOrNum = unionWithOptionalParameter2('hello', 10); // error no call signature
strOrNum = unionWithOptionalParameter2('hello', "hello"); // error no call signature
strOrNum = unionWithOptionalParameter2(); // error no call signature
var unionWithOptionalParameter3: { (a: string, b?: number): string; } | { (a: string): number; };
strOrNum = unionWithOptionalParameter3('hello'); // error no call signature
strOrNum = unionWithOptionalParameter3('hello', 10); // error no call signature
strOrNum = unionWithOptionalParameter3('hello', "hello"); // error no call signature
strOrNum = unionWithOptionalParameter3(); // error no call signature
var unionWithRestParameter1: { (a: string, ...b: number[]): string; } | { (a: string, ...b: number[]): number };
strOrNum = unionWithRestParameter1('hello');
strOrNum = unionWithRestParameter1('hello', 10);
strOrNum = unionWithRestParameter1('hello', 10, 11);
strOrNum = unionWithRestParameter1('hello', "hello"); // error in parameter type
strOrNum = unionWithRestParameter1(); // error
var unionWithRestParameter2: { (a: string, ...b: number[]): string; } | { (a: string, b: number): number };
strOrNum = unionWithRestParameter2('hello'); // error no call signature
strOrNum = unionWithRestParameter2('hello', 10); // error no call signature
strOrNum = unionWithRestParameter2('hello', 10, 11); // error no call signature
strOrNum = unionWithRestParameter2('hello', "hello"); // error no call signature
strOrNum = unionWithRestParameter2(); // error no call signature
var unionWithRestParameter3: { (a: string, ...b: number[]): string; } | { (a: string): number };
strOrNum = unionWithRestParameter3('hello'); // error no call signature
strOrNum = unionWithRestParameter3('hello', 10); // error no call signature
strOrNum = unionWithRestParameter3('hello', 10, 11); // error no call signature
strOrNum = unionWithRestParameter3('hello', "hello"); // error no call signature
strOrNum = unionWithRestParameter3(); // error no call signature
//// [unionTypeCallSignatures.js]
var numOrDate;
var strOrBoolean;
var strOrNum;
// If each type in U has call signatures and the sets of call signatures are identical ignoring return types,
// U has the same set of call signatures, but with return types that are unions of the return types of the respective call signatures from each type in U.
var unionOfDifferentReturnType;
numOrDate = unionOfDifferentReturnType(10);
strOrBoolean = unionOfDifferentReturnType("hello"); // error
unionOfDifferentReturnType1(true); // error in type of parameter
var unionOfDifferentReturnType1;
numOrDate = unionOfDifferentReturnType1(10);
strOrBoolean = unionOfDifferentReturnType1("hello");
unionOfDifferentReturnType1(true); // error in type of parameter
unionOfDifferentReturnType1(); // error missing parameter
var unionOfDifferentParameterTypes;
unionOfDifferentParameterTypes(10); // error - no call signatures
unionOfDifferentParameterTypes("hello"); // error - no call signatures
unionOfDifferentParameterTypes(); // error - no call signatures
var unionOfDifferentNumberOfSignatures;
unionOfDifferentNumberOfSignatures(); // error - no call signatures
unionOfDifferentNumberOfSignatures(10); // error - no call signatures
unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
var unionWithDifferentParameterCount;
unionWithDifferentParameterCount(); // no call signature
unionWithDifferentParameterCount("hello"); // no call signature
unionWithDifferentParameterCount("hello", 10); // no call signature
var unionWithOptionalParameter1;
strOrNum = unionWithOptionalParameter1('hello');
strOrNum = unionWithOptionalParameter1('hello', 10);
strOrNum = unionWithOptionalParameter1('hello', "hello"); // error in parameter type
strOrNum = unionWithOptionalParameter1(); // error
var unionWithOptionalParameter2;
strOrNum = unionWithOptionalParameter2('hello'); // error no call signature
strOrNum = unionWithOptionalParameter2('hello', 10); // error no call signature
strOrNum = unionWithOptionalParameter2('hello', "hello"); // error no call signature
strOrNum = unionWithOptionalParameter2(); // error no call signature
var unionWithOptionalParameter3;
strOrNum = unionWithOptionalParameter3('hello'); // error no call signature
strOrNum = unionWithOptionalParameter3('hello', 10); // error no call signature
strOrNum = unionWithOptionalParameter3('hello', "hello"); // error no call signature
strOrNum = unionWithOptionalParameter3(); // error no call signature
var unionWithRestParameter1;
strOrNum = unionWithRestParameter1('hello');
strOrNum = unionWithRestParameter1('hello', 10);
strOrNum = unionWithRestParameter1('hello', 10, 11);
strOrNum = unionWithRestParameter1('hello', "hello"); // error in parameter type
strOrNum = unionWithRestParameter1(); // error
var unionWithRestParameter2;
strOrNum = unionWithRestParameter2('hello'); // error no call signature
strOrNum = unionWithRestParameter2('hello', 10); // error no call signature
strOrNum = unionWithRestParameter2('hello', 10, 11); // error no call signature
strOrNum = unionWithRestParameter2('hello', "hello"); // error no call signature
strOrNum = unionWithRestParameter2(); // error no call signature
var unionWithRestParameter3;
strOrNum = unionWithRestParameter3('hello'); // error no call signature
strOrNum = unionWithRestParameter3('hello', 10); // error no call signature
strOrNum = unionWithRestParameter3('hello', 10, 11); // error no call signature
strOrNum = unionWithRestParameter3('hello', "hello"); // error no call signature
strOrNum = unionWithRestParameter3(); // error no call signature
@@ -0,0 +1,178 @@
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(9,47): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(10,33): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(15,33): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(16,1): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(19,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(20,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(21,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(24,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(25,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(26,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(29,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(30,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(31,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(36,53): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(37,12): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(40,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(41,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(42,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(43,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(46,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(47,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(48,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(49,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(55,49): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(56,12): error TS2346: Supplied parameters do not match any signature of call target.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(59,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(60,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(61,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(62,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(63,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(66,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(67,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(68,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(69,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
tests/cases/conformance/types/union/unionTypeConstructSignatures.ts(70,12): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
==== tests/cases/conformance/types/union/unionTypeConstructSignatures.ts (35 errors) ====
var numOrDate: number | Date;
var strOrBoolean: string | boolean;
var strOrNum: string | number;
// If each type in U has construct signatures and the sets of construct signatures are identical ignoring return types,
// U has the same set of construct signatures, but with return types that are unions of the return types of the respective construct signatures from each type in U.
var unionOfDifferentReturnType: { new (a: number): number; } | { new (a: number): Date; };
numOrDate = new unionOfDifferentReturnType(10);
strOrBoolean = new unionOfDifferentReturnType("hello"); // error
~~~~~~~
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
new unionOfDifferentReturnType1(true); // error in type of parameter
~~~~
!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
var unionOfDifferentReturnType1: { new (a: number): number; new (a: string): string; } | { new (a: number): Date; new (a: string): boolean; };
numOrDate = new unionOfDifferentReturnType1(10);
strOrBoolean = new unionOfDifferentReturnType1("hello");
new unionOfDifferentReturnType1(true); // error in type of parameter
~~~~
!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'.
new unionOfDifferentReturnType1(); // error missing parameter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
var unionOfDifferentParameterTypes: { new (a: number): number; } | { new (a: string): Date; };
new unionOfDifferentParameterTypes(10);// error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
new unionOfDifferentParameterTypes("hello");// error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
new unionOfDifferentParameterTypes();// error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
var unionOfDifferentNumberOfSignatures: { new (a: number): number; } | { new (a: number): Date; new (a: string): boolean; };
new unionOfDifferentNumberOfSignatures(); // error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
new unionOfDifferentNumberOfSignatures(10); // error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
new unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
var unionWithDifferentParameterCount: { new (a: string): string; } | { new (a: string, b: number): number; };
new unionWithDifferentParameterCount();// no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
new unionWithDifferentParameterCount("hello");// no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
new unionWithDifferentParameterCount("hello", 10);// no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
var unionWithOptionalParameter1: { new (a: string, b?: number): string; } | { new (a: string, b?: number): number; };
strOrNum = new unionWithOptionalParameter1('hello');
strOrNum = new unionWithOptionalParameter1('hello', 10);
strOrNum = new unionWithOptionalParameter1('hello', "hello"); // error in parameter type
~~~~~~~
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
strOrNum = new unionWithOptionalParameter1(); // error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
var unionWithOptionalParameter2: { new (a: string, b?: number): string; } | { new (a: string, b: number): number };
strOrNum = new unionWithOptionalParameter2('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithOptionalParameter2('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithOptionalParameter2('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithOptionalParameter2(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
var unionWithOptionalParameter3: { new (a: string, b?: number): string; } | { new (a: string): number; };
strOrNum = new unionWithOptionalParameter3('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithOptionalParameter3('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithOptionalParameter3('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithOptionalParameter3(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
var unionWithRestParameter1: { new (a: string, ...b: number[]): string; } | { new (a: string, ...b: number[]): number };
strOrNum = new unionWithRestParameter1('hello');
strOrNum = new unionWithRestParameter1('hello', 10);
strOrNum = new unionWithRestParameter1('hello', 10, 11);
strOrNum = new unionWithRestParameter1('hello', "hello"); // error in parameter type
~~~~~~~
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
strOrNum = new unionWithRestParameter1(); // error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2346: Supplied parameters do not match any signature of call target.
var unionWithRestParameter2: { new (a: string, ...b: number[]): string; } | { new (a: string, b: number): number };
strOrNum = new unionWithRestParameter2('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter2('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter2('hello', 10, 11); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter2('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter2(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
var unionWithRestParameter3: { new (a: string, ...b: number[]): string; } | { new (a: string): number };
strOrNum = new unionWithRestParameter3('hello'); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter3('hello', 10); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter3('hello', 10, 11); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter3('hello', "hello"); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
strOrNum = new unionWithRestParameter3(); // error no call signature
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
@@ -0,0 +1,132 @@
//// [unionTypeConstructSignatures.ts]
var numOrDate: number | Date;
var strOrBoolean: string | boolean;
var strOrNum: string | number;
// If each type in U has construct signatures and the sets of construct signatures are identical ignoring return types,
// U has the same set of construct signatures, but with return types that are unions of the return types of the respective construct signatures from each type in U.
var unionOfDifferentReturnType: { new (a: number): number; } | { new (a: number): Date; };
numOrDate = new unionOfDifferentReturnType(10);
strOrBoolean = new unionOfDifferentReturnType("hello"); // error
new unionOfDifferentReturnType1(true); // error in type of parameter
var unionOfDifferentReturnType1: { new (a: number): number; new (a: string): string; } | { new (a: number): Date; new (a: string): boolean; };
numOrDate = new unionOfDifferentReturnType1(10);
strOrBoolean = new unionOfDifferentReturnType1("hello");
new unionOfDifferentReturnType1(true); // error in type of parameter
new unionOfDifferentReturnType1(); // error missing parameter
var unionOfDifferentParameterTypes: { new (a: number): number; } | { new (a: string): Date; };
new unionOfDifferentParameterTypes(10);// error - no call signatures
new unionOfDifferentParameterTypes("hello");// error - no call signatures
new unionOfDifferentParameterTypes();// error - no call signatures
var unionOfDifferentNumberOfSignatures: { new (a: number): number; } | { new (a: number): Date; new (a: string): boolean; };
new unionOfDifferentNumberOfSignatures(); // error - no call signatures
new unionOfDifferentNumberOfSignatures(10); // error - no call signatures
new unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
var unionWithDifferentParameterCount: { new (a: string): string; } | { new (a: string, b: number): number; };
new unionWithDifferentParameterCount();// no call signature
new unionWithDifferentParameterCount("hello");// no call signature
new unionWithDifferentParameterCount("hello", 10);// no call signature
var unionWithOptionalParameter1: { new (a: string, b?: number): string; } | { new (a: string, b?: number): number; };
strOrNum = new unionWithOptionalParameter1('hello');
strOrNum = new unionWithOptionalParameter1('hello', 10);
strOrNum = new unionWithOptionalParameter1('hello', "hello"); // error in parameter type
strOrNum = new unionWithOptionalParameter1(); // error
var unionWithOptionalParameter2: { new (a: string, b?: number): string; } | { new (a: string, b: number): number };
strOrNum = new unionWithOptionalParameter2('hello'); // error no call signature
strOrNum = new unionWithOptionalParameter2('hello', 10); // error no call signature
strOrNum = new unionWithOptionalParameter2('hello', "hello"); // error no call signature
strOrNum = new unionWithOptionalParameter2(); // error no call signature
var unionWithOptionalParameter3: { new (a: string, b?: number): string; } | { new (a: string): number; };
strOrNum = new unionWithOptionalParameter3('hello'); // error no call signature
strOrNum = new unionWithOptionalParameter3('hello', 10); // error no call signature
strOrNum = new unionWithOptionalParameter3('hello', "hello"); // error no call signature
strOrNum = new unionWithOptionalParameter3(); // error no call signature
var unionWithRestParameter1: { new (a: string, ...b: number[]): string; } | { new (a: string, ...b: number[]): number };
strOrNum = new unionWithRestParameter1('hello');
strOrNum = new unionWithRestParameter1('hello', 10);
strOrNum = new unionWithRestParameter1('hello', 10, 11);
strOrNum = new unionWithRestParameter1('hello', "hello"); // error in parameter type
strOrNum = new unionWithRestParameter1(); // error
var unionWithRestParameter2: { new (a: string, ...b: number[]): string; } | { new (a: string, b: number): number };
strOrNum = new unionWithRestParameter2('hello'); // error no call signature
strOrNum = new unionWithRestParameter2('hello', 10); // error no call signature
strOrNum = new unionWithRestParameter2('hello', 10, 11); // error no call signature
strOrNum = new unionWithRestParameter2('hello', "hello"); // error no call signature
strOrNum = new unionWithRestParameter2(); // error no call signature
var unionWithRestParameter3: { new (a: string, ...b: number[]): string; } | { new (a: string): number };
strOrNum = new unionWithRestParameter3('hello'); // error no call signature
strOrNum = new unionWithRestParameter3('hello', 10); // error no call signature
strOrNum = new unionWithRestParameter3('hello', 10, 11); // error no call signature
strOrNum = new unionWithRestParameter3('hello', "hello"); // error no call signature
strOrNum = new unionWithRestParameter3(); // error no call signature
//// [unionTypeConstructSignatures.js]
var numOrDate;
var strOrBoolean;
var strOrNum;
// If each type in U has construct signatures and the sets of construct signatures are identical ignoring return types,
// U has the same set of construct signatures, but with return types that are unions of the return types of the respective construct signatures from each type in U.
var unionOfDifferentReturnType;
numOrDate = new unionOfDifferentReturnType(10);
strOrBoolean = new unionOfDifferentReturnType("hello"); // error
new unionOfDifferentReturnType1(true); // error in type of parameter
var unionOfDifferentReturnType1;
numOrDate = new unionOfDifferentReturnType1(10);
strOrBoolean = new unionOfDifferentReturnType1("hello");
new unionOfDifferentReturnType1(true); // error in type of parameter
new unionOfDifferentReturnType1(); // error missing parameter
var unionOfDifferentParameterTypes;
new unionOfDifferentParameterTypes(10); // error - no call signatures
new unionOfDifferentParameterTypes("hello"); // error - no call signatures
new unionOfDifferentParameterTypes(); // error - no call signatures
var unionOfDifferentNumberOfSignatures;
new unionOfDifferentNumberOfSignatures(); // error - no call signatures
new unionOfDifferentNumberOfSignatures(10); // error - no call signatures
new unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
var unionWithDifferentParameterCount;
new unionWithDifferentParameterCount(); // no call signature
new unionWithDifferentParameterCount("hello"); // no call signature
new unionWithDifferentParameterCount("hello", 10); // no call signature
var unionWithOptionalParameter1;
strOrNum = new unionWithOptionalParameter1('hello');
strOrNum = new unionWithOptionalParameter1('hello', 10);
strOrNum = new unionWithOptionalParameter1('hello', "hello"); // error in parameter type
strOrNum = new unionWithOptionalParameter1(); // error
var unionWithOptionalParameter2;
strOrNum = new unionWithOptionalParameter2('hello'); // error no call signature
strOrNum = new unionWithOptionalParameter2('hello', 10); // error no call signature
strOrNum = new unionWithOptionalParameter2('hello', "hello"); // error no call signature
strOrNum = new unionWithOptionalParameter2(); // error no call signature
var unionWithOptionalParameter3;
strOrNum = new unionWithOptionalParameter3('hello'); // error no call signature
strOrNum = new unionWithOptionalParameter3('hello', 10); // error no call signature
strOrNum = new unionWithOptionalParameter3('hello', "hello"); // error no call signature
strOrNum = new unionWithOptionalParameter3(); // error no call signature
var unionWithRestParameter1;
strOrNum = new unionWithRestParameter1('hello');
strOrNum = new unionWithRestParameter1('hello', 10);
strOrNum = new unionWithRestParameter1('hello', 10, 11);
strOrNum = new unionWithRestParameter1('hello', "hello"); // error in parameter type
strOrNum = new unionWithRestParameter1(); // error
var unionWithRestParameter2;
strOrNum = new unionWithRestParameter2('hello'); // error no call signature
strOrNum = new unionWithRestParameter2('hello', 10); // error no call signature
strOrNum = new unionWithRestParameter2('hello', 10, 11); // error no call signature
strOrNum = new unionWithRestParameter2('hello', "hello"); // error no call signature
strOrNum = new unionWithRestParameter2(); // error no call signature
var unionWithRestParameter3;
strOrNum = new unionWithRestParameter3('hello'); // error no call signature
strOrNum = new unionWithRestParameter3('hello', 10); // error no call signature
strOrNum = new unionWithRestParameter3('hello', 10, 11); // error no call signature
strOrNum = new unionWithRestParameter3('hello', "hello"); // error no call signature
strOrNum = new unionWithRestParameter3(); // error no call signature
@@ -0,0 +1,56 @@
//// [unionTypeEquivalence.ts]
// A | B is equivalent to A if B is a subtype of A
class C { }
class D extends C { foo() { } }
var x: C;
var x : C | D;
// A | B is equivalent to B | A.
var y: string | number;
var y : number | string;
// AB | C is equivalent to A | BC, where AB is A | B and BC is B | C.
var z : string | number | boolean;
var z : (string | number) | boolean;
var z : string | (number | boolean);
var AB : string | number;
var BC : number | boolean;
var z1: typeof AB | boolean;
var z1: string | typeof BC;
//// [unionTypeEquivalence.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 __();
};
// A | B is equivalent to A if B is a subtype of A
var C = (function () {
function C() {
}
return C;
})();
var D = (function (_super) {
__extends(D, _super);
function D() {
_super.apply(this, arguments);
}
D.prototype.foo = function () {
};
return D;
})(C);
var x;
var x;
// A | B is equivalent to B | A.
var y;
var y;
// AB | C is equivalent to A | BC, where AB is A | B and BC is B | C.
var z;
var z;
var z;
var AB;
var BC;
var z1;
var z1;
@@ -0,0 +1,50 @@
=== tests/cases/conformance/types/union/unionTypeEquivalence.ts ===
// A | B is equivalent to A if B is a subtype of A
class C { }
>C : C
class D extends C { foo() { } }
>D : D
>C : C
>foo : () => void
var x: C;
>x : C
>C : C
var x : C | D;
>x : C
>C : C
>D : D
// A | B is equivalent to B | A.
var y: string | number;
>y : string | number
var y : number | string;
>y : string | number
// AB | C is equivalent to A | BC, where AB is A | B and BC is B | C.
var z : string | number | boolean;
>z : string | number | boolean
var z : (string | number) | boolean;
>z : string | number | boolean
var z : string | (number | boolean);
>z : string | number | boolean
var AB : string | number;
>AB : string | number
var BC : number | boolean;
>BC : number | boolean
var z1: typeof AB | boolean;
>z1 : string | number | boolean
>AB : string | number
var z1: string | typeof BC;
>z1 : string | number | boolean
>BC : number | boolean
@@ -0,0 +1,79 @@
//// [unionTypeFromArrayLiteral.ts]
// The resulting type an array literal expression is determined as follows:
// If the array literal is empty, the resulting type is an array type with the element type Undefined.
// Otherwise, if the array literal is contextually typed by a type that has a property with the numeric name 0, the resulting type is a tuple type constructed from the types of the element expressions.
// Otherwise, the resulting type is an array type with an element type that is the union of the types of the element expressions.
var arr1 = [1, 2]; // number[]
var arr2 = ["hello", true]; // (string | number)[]
var arr3Tuple: [number, string] = [3, "three"]; // [number, string]
var arr4Tuple: [number, string] = [3, "three", "hello"]; // [number, string, string]
var arrEmpty = [];
var arr5Tuple: {
0: string;
5: number;
} = ["hello", true, false, " hello", true, 10, "any"]; // Tuple
class C { foo() { } }
class D { foo2() { } }
class E extends C { foo3() { } }
class F extends C { foo4() { } }
var c: C, d: D, e: E, f: F;
var arr6 = [c, d]; // (C | D)[]
var arr7 = [c, d, e]; // (C | D)[]
var arr8 = [c, e]; // C[]
var arr9 = [e, f]; // (E|F)[]
//// [unionTypeFromArrayLiteral.js]
// The resulting type an array literal expression is determined as follows:
// If the array literal is empty, the resulting type is an array type with the element type Undefined.
// Otherwise, if the array literal is contextually typed by a type that has a property with the numeric name 0, the resulting type is a tuple type constructed from the types of the element expressions.
// Otherwise, the resulting type is an array type with an element type that is the union of the types of the element expressions.
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 arr1 = [1, 2]; // number[]
var arr2 = ["hello", true]; // (string | number)[]
var arr3Tuple = [3, "three"]; // [number, string]
var arr4Tuple = [3, "three", "hello"]; // [number, string, string]
var arrEmpty = [];
var arr5Tuple = ["hello", true, false, " hello", true, 10, "any"]; // Tuple
var C = (function () {
function C() {
}
C.prototype.foo = function () {
};
return C;
})();
var D = (function () {
function D() {
}
D.prototype.foo2 = function () {
};
return D;
})();
var E = (function (_super) {
__extends(E, _super);
function E() {
_super.apply(this, arguments);
}
E.prototype.foo3 = function () {
};
return E;
})(C);
var F = (function (_super) {
__extends(F, _super);
function F() {
_super.apply(this, arguments);
}
F.prototype.foo4 = function () {
};
return F;
})(C);
var c, d, e, f;
var arr6 = [c, d]; // (C | D)[]
var arr7 = [c, d, e]; // (C | D)[]
var arr8 = [c, e]; // C[]
var arr9 = [e, f]; // (E|F)[]
@@ -0,0 +1,87 @@
=== tests/cases/conformance/types/union/unionTypeFromArrayLiteral.ts ===
// The resulting type an array literal expression is determined as follows:
// If the array literal is empty, the resulting type is an array type with the element type Undefined.
// Otherwise, if the array literal is contextually typed by a type that has a property with the numeric name 0, the resulting type is a tuple type constructed from the types of the element expressions.
// Otherwise, the resulting type is an array type with an element type that is the union of the types of the element expressions.
var arr1 = [1, 2]; // number[]
>arr1 : number[]
>[1, 2] : number[]
var arr2 = ["hello", true]; // (string | number)[]
>arr2 : (string | boolean)[]
>["hello", true] : (string | boolean)[]
var arr3Tuple: [number, string] = [3, "three"]; // [number, string]
>arr3Tuple : [number, string]
>[3, "three"] : [number, string]
var arr4Tuple: [number, string] = [3, "three", "hello"]; // [number, string, string]
>arr4Tuple : [number, string]
>[3, "three", "hello"] : [number, string, string]
var arrEmpty = [];
>arrEmpty : any[]
>[] : undefined[]
var arr5Tuple: {
>arr5Tuple : { 0: string; 5: number; }
0: string;
5: number;
} = ["hello", true, false, " hello", true, 10, "any"]; // Tuple
>["hello", true, false, " hello", true, 10, "any"] : [string, boolean, boolean, string, boolean, number, string]
class C { foo() { } }
>C : C
>foo : () => void
class D { foo2() { } }
>D : D
>foo2 : () => void
class E extends C { foo3() { } }
>E : E
>C : C
>foo3 : () => void
class F extends C { foo4() { } }
>F : F
>C : C
>foo4 : () => void
var c: C, d: D, e: E, f: F;
>c : C
>C : C
>d : D
>D : D
>e : E
>E : E
>f : F
>F : F
var arr6 = [c, d]; // (C | D)[]
>arr6 : (C | D)[]
>[c, d] : (C | D)[]
>c : C
>d : D
var arr7 = [c, d, e]; // (C | D)[]
>arr7 : (C | D)[]
>[c, d, e] : (C | D)[]
>c : C
>d : D
>e : E
var arr8 = [c, e]; // C[]
>arr8 : C[]
>[c, e] : C[]
>c : C
>e : E
var arr9 = [e, f]; // (E|F)[]
>arr9 : (E | F)[]
>[e, f] : (E | F)[]
>e : E
>f : F
@@ -0,0 +1,20 @@
tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/unionTypeIdentity.ts(6,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'strOrNum' must be of type 'string | boolean', but here has type 'string'.
tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/unionTypeIdentity.ts(7,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'strOrNum' must be of type 'string | boolean', but here has type 'boolean'.
tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/unionTypeIdentity.ts(8,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'strOrNum' must be of type 'string | boolean', but here has type 'number'.
==== tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/unionTypeIdentity.ts (3 errors) ====
// Two types are considered identical when
// they are union types with identical sets of constituent types, or
var strOrNum: string | boolean;
var strOrNum: boolean | string;
var strOrNum: boolean | string | boolean;
var strOrNum: string; // error
~~~~~~~~
!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'strOrNum' must be of type 'string | boolean', but here has type 'string'.
var strOrNum: boolean; // error
~~~~~~~~
!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'strOrNum' must be of type 'string | boolean', but here has type 'boolean'.
var strOrNum: number; // error
~~~~~~~~
!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'strOrNum' must be of type 'string | boolean', but here has type 'number'.
@@ -0,0 +1,19 @@
//// [unionTypeIdentity.ts]
// Two types are considered identical when
// they are union types with identical sets of constituent types, or
var strOrNum: string | boolean;
var strOrNum: boolean | string;
var strOrNum: boolean | string | boolean;
var strOrNum: string; // error
var strOrNum: boolean; // error
var strOrNum: number; // error
//// [unionTypeIdentity.js]
// Two types are considered identical when
// they are union types with identical sets of constituent types, or
var strOrNum;
var strOrNum;
var strOrNum;
var strOrNum; // error
var strOrNum; // error
var strOrNum; // error
@@ -0,0 +1,44 @@
//// [unionTypeIndexSignature.ts]
var numOrDate: number | Date;
var anyVar: number;
// If each type in U has a string index signature,
// U has a string index signature of a union type of the types of the string index signatures from each type in U.
var unionOfDifferentReturnType: { [a: string]: number; } | { [a: string]: Date; };
numOrDate = unionOfDifferentReturnType["hello"]; // number | Date
numOrDate = unionOfDifferentReturnType[10]; // number | Date
var unionOfTypesWithAndWithoutStringSignature: { [a: string]: number; } | boolean;
anyVar = unionOfTypesWithAndWithoutStringSignature["hello"]; // any
anyVar = unionOfTypesWithAndWithoutStringSignature[10]; // any
// If each type in U has a numeric index signature,
// U has a numeric index signature of a union type of the types of the numeric index signatures from each type in U.
var unionOfDifferentReturnType1: { [a: number]: number; } | { [a: number]: Date; };
numOrDate = unionOfDifferentReturnType1["hello"]; // any
numOrDate = unionOfDifferentReturnType1[10]; // number | Date
var unionOfTypesWithAndWithoutStringSignature1: { [a: number]: number; } | boolean;
anyVar = unionOfTypesWithAndWithoutStringSignature1["hello"]; // any
anyVar = unionOfTypesWithAndWithoutStringSignature1[10]; // any
//// [unionTypeIndexSignature.js]
var numOrDate;
var anyVar;
// If each type in U has a string index signature,
// U has a string index signature of a union type of the types of the string index signatures from each type in U.
var unionOfDifferentReturnType;
numOrDate = unionOfDifferentReturnType["hello"]; // number | Date
numOrDate = unionOfDifferentReturnType[10]; // number | Date
var unionOfTypesWithAndWithoutStringSignature;
anyVar = unionOfTypesWithAndWithoutStringSignature["hello"]; // any
anyVar = unionOfTypesWithAndWithoutStringSignature[10]; // any
// If each type in U has a numeric index signature,
// U has a numeric index signature of a union type of the types of the numeric index signatures from each type in U.
var unionOfDifferentReturnType1;
numOrDate = unionOfDifferentReturnType1["hello"]; // any
numOrDate = unionOfDifferentReturnType1[10]; // number | Date
var unionOfTypesWithAndWithoutStringSignature1;
anyVar = unionOfTypesWithAndWithoutStringSignature1["hello"]; // any
anyVar = unionOfTypesWithAndWithoutStringSignature1[10]; // any
@@ -0,0 +1,81 @@
=== tests/cases/conformance/types/union/unionTypeIndexSignature.ts ===
var numOrDate: number | Date;
>numOrDate : number | Date
>Date : Date
var anyVar: number;
>anyVar : number
// If each type in U has a string index signature,
// U has a string index signature of a union type of the types of the string index signatures from each type in U.
var unionOfDifferentReturnType: { [a: string]: number; } | { [a: string]: Date; };
>unionOfDifferentReturnType : { [x: string]: number; } | { [x: string]: Date; }
>a : string
>a : string
>Date : Date
numOrDate = unionOfDifferentReturnType["hello"]; // number | Date
>numOrDate = unionOfDifferentReturnType["hello"] : number | Date
>numOrDate : number | Date
>unionOfDifferentReturnType["hello"] : number | Date
>unionOfDifferentReturnType : { [x: string]: number; } | { [x: string]: Date; }
numOrDate = unionOfDifferentReturnType[10]; // number | Date
>numOrDate = unionOfDifferentReturnType[10] : number | Date
>numOrDate : number | Date
>unionOfDifferentReturnType[10] : number | Date
>unionOfDifferentReturnType : { [x: string]: number; } | { [x: string]: Date; }
var unionOfTypesWithAndWithoutStringSignature: { [a: string]: number; } | boolean;
>unionOfTypesWithAndWithoutStringSignature : boolean | { [x: string]: number; }
>a : string
anyVar = unionOfTypesWithAndWithoutStringSignature["hello"]; // any
>anyVar = unionOfTypesWithAndWithoutStringSignature["hello"] : any
>anyVar : number
>unionOfTypesWithAndWithoutStringSignature["hello"] : any
>unionOfTypesWithAndWithoutStringSignature : boolean | { [x: string]: number; }
anyVar = unionOfTypesWithAndWithoutStringSignature[10]; // any
>anyVar = unionOfTypesWithAndWithoutStringSignature[10] : any
>anyVar : number
>unionOfTypesWithAndWithoutStringSignature[10] : any
>unionOfTypesWithAndWithoutStringSignature : boolean | { [x: string]: number; }
// If each type in U has a numeric index signature,
// U has a numeric index signature of a union type of the types of the numeric index signatures from each type in U.
var unionOfDifferentReturnType1: { [a: number]: number; } | { [a: number]: Date; };
>unionOfDifferentReturnType1 : { [x: number]: number; } | { [x: number]: Date; }
>a : number
>a : number
>Date : Date
numOrDate = unionOfDifferentReturnType1["hello"]; // any
>numOrDate = unionOfDifferentReturnType1["hello"] : any
>numOrDate : number | Date
>unionOfDifferentReturnType1["hello"] : any
>unionOfDifferentReturnType1 : { [x: number]: number; } | { [x: number]: Date; }
numOrDate = unionOfDifferentReturnType1[10]; // number | Date
>numOrDate = unionOfDifferentReturnType1[10] : number | Date
>numOrDate : number | Date
>unionOfDifferentReturnType1[10] : number | Date
>unionOfDifferentReturnType1 : { [x: number]: number; } | { [x: number]: Date; }
var unionOfTypesWithAndWithoutStringSignature1: { [a: number]: number; } | boolean;
>unionOfTypesWithAndWithoutStringSignature1 : boolean | { [x: number]: number; }
>a : number
anyVar = unionOfTypesWithAndWithoutStringSignature1["hello"]; // any
>anyVar = unionOfTypesWithAndWithoutStringSignature1["hello"] : any
>anyVar : number
>unionOfTypesWithAndWithoutStringSignature1["hello"] : any
>unionOfTypesWithAndWithoutStringSignature1 : boolean | { [x: number]: number; }
anyVar = unionOfTypesWithAndWithoutStringSignature1[10]; // any
>anyVar = unionOfTypesWithAndWithoutStringSignature1[10] : any
>anyVar : number
>unionOfTypesWithAndWithoutStringSignature1[10] : any
>unionOfTypesWithAndWithoutStringSignature1 : boolean | { [x: number]: number; }
@@ -0,0 +1,29 @@
//// [unionTypeLiterals.ts]
// basic valid forms of union literals
var simpleUnion: string | number;
var unionOfUnion: string | number | boolean;
var arrayOfUnions: (string | number)[];
var arrayOfUnions: Array<string | number>;
var unionOfFunctionType: (() => string) | (() => number);
var unionOfFunctionType: { (): string } | { (): number };
var unionOfFunctionType: () => string | number;
var unionOfConstructorType: (new () => string) | (new () => number);
var unionOfConstructorType: { new (): string } | { new (): number };
var unionOfConstructorType: new () => string | number;
//// [unionTypeLiterals.js]
// basic valid forms of union literals
var simpleUnion;
var unionOfUnion;
var arrayOfUnions;
var arrayOfUnions;
var unionOfFunctionType;
var unionOfFunctionType;
var unionOfFunctionType;
var unionOfConstructorType;
var unionOfConstructorType;
var unionOfConstructorType;
@@ -0,0 +1,34 @@
=== tests/cases/conformance/types/specifyingTypes/typeLiterals/unionTypeLiterals.ts ===
// basic valid forms of union literals
var simpleUnion: string | number;
>simpleUnion : string | number
var unionOfUnion: string | number | boolean;
>unionOfUnion : string | number | boolean
var arrayOfUnions: (string | number)[];
>arrayOfUnions : (string | number)[]
var arrayOfUnions: Array<string | number>;
>arrayOfUnions : (string | number)[]
>Array : T[]
var unionOfFunctionType: (() => string) | (() => number);
>unionOfFunctionType : (() => string) | (() => number)
var unionOfFunctionType: { (): string } | { (): number };
>unionOfFunctionType : (() => string) | (() => number)
var unionOfFunctionType: () => string | number;
>unionOfFunctionType : (() => string) | (() => number)
var unionOfConstructorType: (new () => string) | (new () => number);
>unionOfConstructorType : (new () => string) | (new () => number)
var unionOfConstructorType: { new (): string } | { new (): number };
>unionOfConstructorType : (new () => string) | (new () => number)
var unionOfConstructorType: new () => string | number;
>unionOfConstructorType : (new () => string) | (new () => number)
@@ -0,0 +1,72 @@
tests/cases/conformance/types/union/unionTypeMembers.ts(44,1): error TS2349: Cannot invoke an expression whose type lacks a call signature.
tests/cases/conformance/types/union/unionTypeMembers.ts(51,3): error TS2339: Property 'propertyOnlyInI1' does not exist on type 'I1<number> | I2<number>'.
tests/cases/conformance/types/union/unionTypeMembers.ts(52,3): error TS2339: Property 'propertyOnlyInI2' does not exist on type 'I1<number> | I2<number>'.
tests/cases/conformance/types/union/unionTypeMembers.ts(53,3): error TS2339: Property 'methodOnlyInI1' does not exist on type 'I1<number> | I2<number>'.
tests/cases/conformance/types/union/unionTypeMembers.ts(54,3): error TS2339: Property 'methodOnlyInI2' does not exist on type 'I1<number> | I2<number>'.
==== tests/cases/conformance/types/union/unionTypeMembers.ts (5 errors) ====
interface I1<T> {
commonMethodType(a: string): string;
commonPropertyType: string;
commonMethodDifferentParameterType(a: string): string;
commonMethodDifferentReturnType(a: string): string;
commonPropertyDifferenType: string;
commonMethodWithTypeParameter(a: T): T;
commonMethodWithOwnTypeParameter<U>(a: U): U;
methodOnlyInI1(a: string): string;
propertyOnlyInI1: string;
}
interface I2<T> {
commonMethodType(a: string): string;
commonPropertyType: string;
commonMethodDifferentParameterType(a: number): number;
commonMethodDifferentReturnType(a: string): number;
commonPropertyDifferenType: number;
commonMethodWithTypeParameter(a: T): T;
commonMethodWithOwnTypeParameter<U>(a: U): U;
methodOnlyInI2(a: string): string;
propertyOnlyInI2: string;
}
// a union type U has those members that are present in every one of its constituent types,
// with types that are unions of the respective members in the constituent types
var x : I1<number> | I2<number>;
var str: string;
var num: number;
var strOrNum: string | number;
// If each type in U has a property P, U has a property P of a union type of the types of P from each type in U.
str = x.commonPropertyType; // string
str = x.commonMethodType(str); // (a: string) => string so result should be string
strOrNum = x.commonPropertyDifferenType;
strOrNum = x.commonMethodDifferentReturnType(str); // string | union
x.commonMethodDifferentParameterType; // No error - property exists
x.commonMethodDifferentParameterType(strOrNum); // error - no call signatures because the type of this property is ((a: string) => string) | (a: number) => number
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
// and the call signatures arent identical
num = x.commonMethodWithTypeParameter(num);
num = x.commonMethodWithOwnTypeParameter(num);
str = x.commonMethodWithOwnTypeParameter(str);
strOrNum = x.commonMethodWithOwnTypeParameter(strOrNum);
x.propertyOnlyInI1; // error
~~~~~~~~~~~~~~~~
!!! error TS2339: Property 'propertyOnlyInI1' does not exist on type 'I1<number> | I2<number>'.
x.propertyOnlyInI2; // error
~~~~~~~~~~~~~~~~
!!! error TS2339: Property 'propertyOnlyInI2' does not exist on type 'I1<number> | I2<number>'.
x.methodOnlyInI1("hello"); // error
~~~~~~~~~~~~~~
!!! error TS2339: Property 'methodOnlyInI1' does not exist on type 'I1<number> | I2<number>'.
x.methodOnlyInI2(10); // error
~~~~~~~~~~~~~~
!!! error TS2339: Property 'methodOnlyInI2' does not exist on type 'I1<number> | I2<number>'.
@@ -0,0 +1,79 @@
//// [unionTypeMembers.ts]
interface I1<T> {
commonMethodType(a: string): string;
commonPropertyType: string;
commonMethodDifferentParameterType(a: string): string;
commonMethodDifferentReturnType(a: string): string;
commonPropertyDifferenType: string;
commonMethodWithTypeParameter(a: T): T;
commonMethodWithOwnTypeParameter<U>(a: U): U;
methodOnlyInI1(a: string): string;
propertyOnlyInI1: string;
}
interface I2<T> {
commonMethodType(a: string): string;
commonPropertyType: string;
commonMethodDifferentParameterType(a: number): number;
commonMethodDifferentReturnType(a: string): number;
commonPropertyDifferenType: number;
commonMethodWithTypeParameter(a: T): T;
commonMethodWithOwnTypeParameter<U>(a: U): U;
methodOnlyInI2(a: string): string;
propertyOnlyInI2: string;
}
// a union type U has those members that are present in every one of its constituent types,
// with types that are unions of the respective members in the constituent types
var x : I1<number> | I2<number>;
var str: string;
var num: number;
var strOrNum: string | number;
// If each type in U has a property P, U has a property P of a union type of the types of P from each type in U.
str = x.commonPropertyType; // string
str = x.commonMethodType(str); // (a: string) => string so result should be string
strOrNum = x.commonPropertyDifferenType;
strOrNum = x.commonMethodDifferentReturnType(str); // string | union
x.commonMethodDifferentParameterType; // No error - property exists
x.commonMethodDifferentParameterType(strOrNum); // error - no call signatures because the type of this property is ((a: string) => string) | (a: number) => number
// and the call signatures arent identical
num = x.commonMethodWithTypeParameter(num);
num = x.commonMethodWithOwnTypeParameter(num);
str = x.commonMethodWithOwnTypeParameter(str);
strOrNum = x.commonMethodWithOwnTypeParameter(strOrNum);
x.propertyOnlyInI1; // error
x.propertyOnlyInI2; // error
x.methodOnlyInI1("hello"); // error
x.methodOnlyInI2(10); // error
//// [unionTypeMembers.js]
// a union type U has those members that are present in every one of its constituent types,
// with types that are unions of the respective members in the constituent types
var x;
var str;
var num;
var strOrNum;
// If each type in U has a property P, U has a property P of a union type of the types of P from each type in U.
str = x.commonPropertyType; // string
str = x.commonMethodType(str); // (a: string) => string so result should be string
strOrNum = x.commonPropertyDifferenType;
strOrNum = x.commonMethodDifferentReturnType(str); // string | union
x.commonMethodDifferentParameterType; // No error - property exists
x.commonMethodDifferentParameterType(strOrNum); // error - no call signatures because the type of this property is ((a: string) => string) | (a: number) => number
// and the call signatures arent identical
num = x.commonMethodWithTypeParameter(num);
num = x.commonMethodWithOwnTypeParameter(num);
str = x.commonMethodWithOwnTypeParameter(str);
strOrNum = x.commonMethodWithOwnTypeParameter(strOrNum);
x.propertyOnlyInI1; // error
x.propertyOnlyInI2; // error
x.methodOnlyInI1("hello"); // error
x.methodOnlyInI2(10); // error
@@ -0,0 +1,154 @@
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(18,1): error TS2322: 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 TS2322: 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 TS2322: 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 TS2322: 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 TS2322: Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(25,1): error TS2322: 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 TS2322: Type 'number' is not assignable to type 'string'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(28,1): error TS2322: 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 TS2322: 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 TS2322: 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 TS2322: 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 TS2322: Type 'D' is not assignable to type 'E'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(37,1): error TS2322: Type 'E' is not assignable to type 'D'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(41,1): error TS2322: Type 'number' is not assignable to type 'string'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(43,1): error TS2322: Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(64,5): error TS2322: Type 'U' is not assignable to type 'T'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(65,5): error TS2322: Type 'T' is not assignable to type 'U'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/unionTypesAssignability.ts(69,5): error TS2322: 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 TS2322: 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 TS2322: Type 'E' is not assignable to type 'D'.
!!! error TS2322: Property 'foo1' is missing in type 'E'.
d = unionDE; // error e is not assignable to d
~
!!! error TS2322: Type 'D | E' is not assignable to type 'D'.
!!! error TS2322: Type 'E' is not assignable to type 'D'.
e = d;
~
!!! error TS2322: Type 'D' is not assignable to type 'E'.
!!! error TS2322: Property 'foo2' is missing in type 'D'.
e = e;
e = unionDE; // error d is not assignable to e
~
!!! error TS2322: Type 'D | E' is not assignable to type 'E'.
!!! error TS2322: Type 'D' is not assignable to type 'E'.
num = num;
num = str;
~~~
!!! error TS2322: Type 'string' is not assignable to type 'number'.
num = unionNumberString; // error string is not assignable to number
~~~
!!! error TS2322: Type 'string | number' is not assignable to type 'number'.
!!! error TS2322: Type 'string' is not assignable to type 'number'.
str = num;
~~~
!!! error TS2322: Type 'number' is not assignable to type 'string'.
str = str;
str = unionNumberString; // error since number is not assignable to string
~~~
!!! error TS2322: Type 'string | number' is not assignable to type 'string'.
!!! error TS2322: 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 TS2322: Type 'C' is not assignable to type 'D'.
!!! error TS2322: Property 'foo1' is missing in type 'C'.
e = c;
~
!!! error TS2322: Type 'C' is not assignable to type 'E'.
!!! error TS2322: Property 'foo2' is missing in type 'C'.
unionDE = c; // error since C is not assinable to either D or E
~~~~~~~
!!! error TS2322: Type 'C' is not assignable to type 'D | E'.
!!! error TS2322: Type 'C' is not assignable to type 'E'.
d = d;
e = d;
~
!!! error TS2322: Type 'D' is not assignable to type 'E'.
unionDE = d; // ok
d = e;
~
!!! error TS2322: Type 'E' is not assignable to type 'D'.
e = e;
unionDE = e; // ok
num = num;
str = num;
~~~
!!! error TS2322: Type 'number' is not assignable to type 'string'.
unionNumberString = num; // ok
num = str;
~~~
!!! error TS2322: 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 TS2322: Type 'U' is not assignable to type 'T'.
u = t; // error
~
!!! error TS2322: 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 TS2322: Type 'T | U' is not assignable to type 'T'.
!!! error TS2322: Type 'U' is not assignable to type 'T'.
u = x; // error T not assignable to U
~
!!! error TS2322: Type 'T | U' is not assignable to type 'U'.
!!! error TS2322: Type 'T' is not assignable to type 'U'.
}
@@ -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
}
@@ -27,77 +27,77 @@ var ra10 = undefined || a1; // undefined || any is any
var rb1 = a1 || a2; // any || boolean is any
var rb2 = a2 || a2; // boolean || boolean is boolean
var rb3 = a3 || a2; // number || boolean is {}
var rb4 = a4 || a2; // string || boolean is {}
var rb5 = a5 || a2; // void || boolean is {}
var rb6 = a6 || a2; // enum || boolean is {}
var rb7 = a7 || a2; // object || boolean is {}
var rb8 = a8 || a2; // array || boolean is {}
var rb3 = a3 || a2; // number || boolean is number | boolean
var rb4 = a4 || a2; // string || boolean is string | boolean
var rb5 = a5 || a2; // void || boolean is void | boolean
var rb6 = a6 || a2; // enum || boolean is E | boolean
var rb7 = a7 || a2; // object || boolean is object | boolean
var rb8 = a8 || a2; // array || boolean is array | boolean
var rb9 = null || a2; // null || boolean is boolean
var rb10= undefined || a2; // undefined || boolean is boolean
var rc1 = a1 || a3; // any || number is any
var rc2 = a2 || a3; // boolean || number is {}
var rc2 = a2 || a3; // boolean || number is boolean | number
var rc3 = a3 || a3; // number || number is number
var rc4 = a4 || a3; // string || number is {}
var rc5 = a5 || a3; // void || number is {}
var rc4 = a4 || a3; // string || number is string | number
var rc5 = a5 || a3; // void || number is void | number
var rc6 = a6 || a3; // enum || number is number
var rc7 = a7 || a3; // object || number is {}
var rc8 = a8 || a3; // array || number is {}
var rc7 = a7 || a3; // object || number is object | number
var rc8 = a8 || a3; // array || number is array | number
var rc9 = null || a3; // null || number is number
var rc10 = undefined || a3; // undefined || number is number
var rd1 = a1 || a4; // any || string is any
var rd2 = a2 || a4; // boolean || string is {}
var rd3 = a3 || a4; // number || string is {}
var rd2 = a2 || a4; // boolean || string is boolean | string
var rd3 = a3 || a4; // number || string is number | string
var rd4 = a4 || a4; // string || string is string
var rd5 = a5 || a4; // void || string is {}
var rd6 = a6 || a4; // enum || string is {}
var rd7 = a7 || a4; // object || string is {}
var rd8 = a8 || a4; // array || string is {}
var rd5 = a5 || a4; // void || string is void | string
var rd6 = a6 || a4; // enum || string is enum | string
var rd7 = a7 || a4; // object || string is object | string
var rd8 = a8 || a4; // array || string is array | string
var rd9 = null || a4; // null || string is string
var rd10 = undefined || a4; // undefined || string is string
var re1 = a1 || a5; // any || void is any
var re2 = a2 || a5; // boolean || void is {}
var re3 = a3 || a5; // number || void is {}
var re4 = a4 || a5; // string || void is {}
var re2 = a2 || a5; // boolean || void is boolean | void
var re3 = a3 || a5; // number || void is number | void
var re4 = a4 || a5; // string || void is string | void
var re5 = a5 || a5; // void || void is void
var re6 = a6 || a5; // enum || void is {}
var re7 = a7 || a5; // object || void is {}
var re8 = a8 || a5; // array || void is {}
var re6 = a6 || a5; // enum || void is enum | void
var re7 = a7 || a5; // object || void is object | void
var re8 = a8 || a5; // array || void is array | void
var re9 = null || a5; // null || void is void
var re10 = undefined || a5; // undefined || void is void
var rg1 = a1 || a6; // any || enum is any
var rg2 = a2 || a6; // boolean || enum is {}
var rg2 = a2 || a6; // boolean || enum is boolean | enum
var rg3 = a3 || a6; // number || enum is number
var rg4 = a4 || a6; // string || enum is {}
var rg5 = a5 || a6; // void || enum is {}
var rg4 = a4 || a6; // string || enum is string | enum
var rg5 = a5 || a6; // void || enum is void | enum
var rg6 = a6 || a6; // enum || enum is E
var rg7 = a7 || a6; // object || enum is {}
var rg8 = a8 || a6; // array || enum is {}
var rg7 = a7 || a6; // object || enum is object | enum
var rg8 = a8 || a6; // array || enum is array | enum
var rg9 = null || a6; // null || enum is E
var rg10 = undefined || a6; // undefined || enum is E
var rh1 = a1 || a7; // any || object is any
var rh2 = a2 || a7; // boolean || object is {}
var rh3 = a3 || a7; // number || object is {}
var rh4 = a4 || a7; // string || object is {}
var rh5 = a5 || a7; // void || object is {}
var rh6 = a6 || a7; // enum || object is {}
var rh2 = a2 || a7; // boolean || object is boolean | object
var rh3 = a3 || a7; // number || object is number | object
var rh4 = a4 || a7; // string || object is string | object
var rh5 = a5 || a7; // void || object is void | object
var rh6 = a6 || a7; // enum || object is enum | object
var rh7 = a7 || a7; // object || object is object
var rh8 = a8 || a7; // array || object is {}
var rh8 = a8 || a7; // array || object is array | object
var rh9 = null || a7; // null || object is object
var rh10 = undefined || a7; // undefined || object is object
var ri1 = a1 || a8; // any || array is any
var ri2 = a2 || a8; // boolean || array is {}
var ri3 = a3 || a8; // number || array is {}
var ri4 = a4 || a8; // string || array is {}
var ri5 = a5 || a8; // void || array is {}
var ri6 = a6 || a8; // enum || array is {}
var ri7 = a7 || a8; // object || array is {}
var ri2 = a2 || a8; // boolean || array is boolean | array
var ri3 = a3 || a8; // number || array is number | array
var ri4 = a4 || a8; // string || array is string | array
var ri5 = a5 || a8; // void || array is void | array
var ri6 = a6 || a8; // enum || array is enum | array
var ri7 = a7 || a8; // object || array is object | array
var ri8 = a8 || a8; // array || array is array
var ri9 = null || a8; // null || array is array
var ri10 = undefined || a8; // undefined || array is array
@@ -19,6 +19,7 @@ condBoolean ? exprBoolean1 : exprBoolean2;
condBoolean ? exprNumber1 : exprNumber2;
condBoolean ? exprString1 : exprString2;
condBoolean ? exprIsObject1 : exprIsObject2;
condBoolean ? exprString1 : exprBoolean1; // union
//Cond is a boolean type literal
true ? exprAny1 : exprAny2;
@@ -26,6 +27,7 @@ false ? exprBoolean1 : exprBoolean2;
true ? exprNumber1 : exprNumber2;
false ? exprString1 : exprString2;
true ? exprIsObject1 : exprIsObject2;
true ? exprString1 : exprBoolean1; // union
//Cond is a boolean type expression
!true ? exprAny1 : exprAny2;
@@ -33,6 +35,7 @@ typeof "123" == "string" ? exprBoolean1 : exprBoolean2;
2 > 1 ? exprNumber1 : exprNumber2;
null === undefined ? exprString1 : exprString2;
true || false ? exprIsObject1 : exprIsObject2;
null === undefined ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condBoolean ? exprAny1 : exprAny2;
@@ -40,15 +43,19 @@ var resultIsBoolean1 = condBoolean ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condBoolean ? exprNumber1 : exprNumber2;
var resultIsString1 = condBoolean ? exprString1 : exprString2;
var resultIsObject1 = condBoolean ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condBoolean ? exprString1 : exprBoolean1; // union
var resultIsAny2 = true ? exprAny1 : exprAny2;
var resultIsBoolean2 = false ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = true ? exprNumber1 : exprNumber2;
var resultIsString2 = false ? exprString1 : exprString2;
var resultIsObject2 = true ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = true ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean3 = false ? exprString1 : exprBoolean1; // union
var resultIsAny3 = !true ? exprAny1 : exprAny2;
var resultIsBoolean3 = typeof "123" == "string" ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = 2 > 1 ? exprNumber1 : exprNumber2;
var resultIsString3 = null === undefined ? exprString1 : exprString2;
var resultIsObject3 = true || false ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean4 = typeof "123" === "string" ? exprString1 : exprBoolean1; // union
@@ -19,6 +19,7 @@ condNumber ? exprBoolean1 : exprBoolean2;
condNumber ? exprNumber1 : exprNumber2;
condNumber ? exprString1 : exprString2;
condNumber ? exprIsObject1 : exprIsObject2;
condNumber ? exprString1 : exprBoolean1; // Union
//Cond is a number type literal
1 ? exprAny1 : exprAny2;
@@ -26,6 +27,7 @@ condNumber ? exprIsObject1 : exprIsObject2;
0.123456789 ? exprNumber1 : exprNumber2;
- 10000000000000 ? exprString1 : exprString2;
1000000000000 ? exprIsObject1 : exprIsObject2;
10000 ? exprString1 : exprBoolean1; // Union
//Cond is a number type expression
function foo() { return 1 };
@@ -36,6 +38,7 @@ var array = [1, 2, 3];
"string".length ? exprNumber1 : exprNumber2;
foo() ? exprString1 : exprString2;
foo() / array[1] ? exprIsObject1 : exprIsObject2;
foo() ? exprString1 : exprBoolean1; // Union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condNumber ? exprAny1 : exprAny2;
@@ -43,15 +46,18 @@ var resultIsBoolean1 = condNumber ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condNumber ? exprNumber1 : exprNumber2;
var resultIsString1 = condNumber ? exprString1 : exprString2;
var resultIsObject1 = condNumber ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condNumber ? exprString1 : exprBoolean1; // Union
var resultIsAny2 = 1 ? exprAny1 : exprAny2;
var resultIsBoolean2 = 0 ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = 0.123456789 ? exprNumber1 : exprNumber2;
var resultIsString2 = - 10000000000000 ? exprString1 : exprString2;
var resultIsObject2 = 1000000000000 ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = 10000 ? exprString1 : exprBoolean1; // Union
var resultIsAny3 = 1 * 0 ? exprAny1 : exprAny2;
var resultIsBoolean3 = 1 + 1 ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = "string".length ? exprNumber1 : exprNumber2;
var resultIsString3 = foo() ? exprString1 : exprString2;
var resultIsObject3 = foo() / array[1] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = foo() / array[1] ? exprString1 : exprBoolean1; // Union
@@ -22,6 +22,7 @@ condObject ? exprBoolean1 : exprBoolean2;
condObject ? exprNumber1 : exprNumber2;
condObject ? exprString1 : exprString2;
condObject ? exprIsObject1 : exprIsObject2;
condObject ? exprString1 : exprBoolean1; // union
//Cond is an object type literal
((a: string) => a.length) ? exprAny1 : exprAny2;
@@ -29,6 +30,7 @@ condObject ? exprIsObject1 : exprIsObject2;
({}) ? exprNumber1 : exprNumber2;
({ a: 1, b: "s" }) ? exprString1 : exprString2;
({ a: 1, b: "s" }) ? exprIsObject1 : exprIsObject2;
({ a: 1, b: "s" }) ? exprString1: exprBoolean1; // union
//Cond is an object type expression
foo() ? exprAny1 : exprAny2;
@@ -36,6 +38,7 @@ new Date() ? exprBoolean1 : exprBoolean2;
new C() ? exprNumber1 : exprNumber2;
C.doIt() ? exprString1 : exprString2;
condObject.valueOf() ? exprIsObject1 : exprIsObject2;
new Date() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condObject ? exprAny1 : exprAny2;
@@ -43,15 +46,18 @@ var resultIsBoolean1 = condObject ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condObject ? exprNumber1 : exprNumber2;
var resultIsString1 = condObject ? exprString1 : exprString2;
var resultIsObject1 = condObject ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condObject ? exprString1 : exprBoolean1; // union
var resultIsAny2 = ((a: string) => a.length) ? exprAny1 : exprAny2;
var resultIsBoolean2 = ((a: string) => a.length) ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = ({}) ? exprNumber1 : exprNumber2;
var resultIsString2 = ({ a: 1, b: "s" }) ? exprString1 : exprString2;
var resultIsObject2 = ({ a: 1, b: "s" }) ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = ({ a: 1, b: "s" }) ? exprString1 : exprBoolean1; // union
var resultIsAny3 = foo() ? exprAny1 : exprAny2;
var resultIsBoolean3 = new Date() ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = new C() ? exprNumber1 : exprNumber2;
var resultIsString3 = C.doIt() ? exprString1 : exprString2;
var resultIsObject3 = condObject.valueOf() ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = C.doIt() ? exprString1 : exprBoolean1; // union
@@ -20,6 +20,7 @@ condAny ? exprBoolean1 : exprBoolean2;
condAny ? exprNumber1 : exprNumber2;
condAny ? exprString1 : exprString2;
condAny ? exprIsObject1 : exprIsObject2;
condAny ? exprString1 : exprBoolean1; // union
//Cond is an any type literal
null ? exprAny1 : exprAny2;
@@ -27,6 +28,7 @@ null ? exprBoolean1 : exprBoolean2;
undefined ? exprNumber1 : exprNumber2;
[null, undefined] ? exprString1 : exprString2;
[null, undefined] ? exprIsObject1 : exprIsObject2;
undefined ? exprString1 : exprBoolean1; // union
//Cond is an any type expression
x.doSomeThing() ? exprAny1 : exprAny2;
@@ -34,6 +36,7 @@ x("x") ? exprBoolean1 : exprBoolean2;
x(x) ? exprNumber1 : exprNumber2;
x("x") ? exprString1 : exprString2;
x.doSomeThing() ? exprIsObject1 : exprIsObject2;
x.doSomeThing() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condAny ? exprAny1 : exprAny2;
@@ -41,15 +44,20 @@ var resultIsBoolean1 = condAny ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condAny ? exprNumber1 : exprNumber2;
var resultIsString1 = condAny ? exprString1 : exprString2;
var resultIsObject1 = condAny ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condAny ? exprString1 : exprBoolean1; // union
var resultIsAny2 = null ? exprAny1 : exprAny2;
var resultIsBoolean2 = null ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = undefined ? exprNumber1 : exprNumber2;
var resultIsString2 = [null, undefined] ? exprString1 : exprString2;
var resultIsObject2 = [null, undefined] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = null ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean3 = undefined ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean4 = [null, undefined] ? exprString1 : exprBoolean1; // union
var resultIsAny3 = x.doSomeThing() ? exprAny1 : exprAny2;
var resultIsBoolean3 = x("x") ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = x(x) ? exprNumber1 : exprNumber2;
var resultIsString3 = x("x") ? exprString1 : exprString2;
var resultIsObject3 = x.doSomeThing() ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean5 = x.doSomeThing() ? exprString1 : exprBoolean1; // union
@@ -19,6 +19,7 @@ condString ? exprBoolean1 : exprBoolean2;
condString ? exprNumber1 : exprNumber2;
condString ? exprString1 : exprString2;
condString ? exprIsObject1 : exprIsObject2;
condString ? exprString1 : exprBoolean1; // union
//Cond is a string type literal
"" ? exprAny1 : exprAny2;
@@ -26,6 +27,7 @@ condString ? exprIsObject1 : exprIsObject2;
'c' ? exprNumber1 : exprNumber2;
'string' ? exprString1 : exprString2;
" " ? exprIsObject1 : exprIsObject2;
"hello " ? exprString1 : exprBoolean1; // union
//Cond is a string type expression
function foo() { return "string" };
@@ -36,6 +38,7 @@ condString.toUpperCase ? exprBoolean1 : exprBoolean2;
condString + "string" ? exprNumber1 : exprNumber2;
foo() ? exprString1 : exprString2;
array[1] ? exprIsObject1 : exprIsObject2;
foo() ? exprString1 : exprBoolean1; // union
//Results shoud be same as Expr1 and Expr2
var resultIsAny1 = condString ? exprAny1 : exprAny2;
@@ -43,15 +46,19 @@ var resultIsBoolean1 = condString ? exprBoolean1 : exprBoolean2;
var resultIsNumber1 = condString ? exprNumber1 : exprNumber2;
var resultIsString1 = condString ? exprString1 : exprString2;
var resultIsObject1 = condString ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean1 = condString ? exprString1 : exprBoolean1; // union
var resultIsAny2 = "" ? exprAny1 : exprAny2;
var resultIsBoolean2 = "string" ? exprBoolean1 : exprBoolean2;
var resultIsNumber2 = 'c' ? exprNumber1 : exprNumber2;
var resultIsString2 = 'string' ? exprString1 : exprString2;
var resultIsObject2 = " " ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean2 = "hello" ? exprString1 : exprBoolean1; // union
var resultIsAny3 = typeof condString ? exprAny1 : exprAny2;
var resultIsBoolean3 = condString.toUpperCase ? exprBoolean1 : exprBoolean2;
var resultIsNumber3 = condString + "string" ? exprNumber1 : exprNumber2;
var resultIsString3 = foo() ? exprString1 : exprString2;
var resultIsObject3 = array[1] ? exprIsObject1 : exprIsObject2;
var resultIsStringOrBoolean3 = typeof condString ? exprString1 : exprBoolean1; // union
var resultIsStringOrBoolean4 = condString.toUpperCase ? exprString1 : exprBoolean1; // union
@@ -14,7 +14,9 @@ var result1 = true ? a : b;
//Be contextually typed and and bct is not identical, results in errors that union type is not assignable to target
var result2: A = true ? a : b;
var result3: B = true ? a : b;
var result31: A | B = true ? a : b;
var result4: (t: X) => number = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result5: (t: X) => string = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result6: (t: X) => boolean = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result6: (t: X) => boolean = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
var result61: (t: X) => number| string = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
@@ -41,3 +41,32 @@ undefined === function (): number {
throw undefined;
var x = 4;
};
class Base { private x; }
class AnotherClass { private y; }
class Derived1 extends Base { private m; }
class Derived2 extends Base { private n; }
function f8() {
return new Derived1();
return new Derived2();
}
var f9 = function () {
return new Derived1();
return new Derived2();
};
var f10 = () => {
return new Derived1();
return new Derived2();
};
function f11() {
return new Base();
return new AnotherClass();
}
var f12 = function () {
return new Base();
return new AnotherClass();
};
var f13 = () => {
return new Base();
return new AnotherClass();
};
@@ -69,6 +69,10 @@ var n = function () {
return 5;
}();
// Otherwise, the inferred return type is the first of the types of the return statement expressions
// in the function body that is a supertype of each of the others,
// ignoring return statements with no expressions.
// A compile - time error occurs if no return statement expression has a type that is a supertype of each of the others.
// FunctionExpression with no return type annotation with multiple return statements with subtype relation between returns
class Base { private m; }
class Derived extends Base { private q; }
@@ -119,5 +123,34 @@ function f6(): number {
return;
}
class Derived2 extends Base { private r: string; }
class AnotherClass { private x }
// if f is a contextually typed function expression, the inferred return type is the union type
// of the types of the return statement expressions in the function body,
// ignoring return statements with no expressions.
var f7: (x: number) => string | number = x => { // should be (x: number) => number | string
if (x < 0) { return x; }
return x.toString();
}
var f8: (x: number) => any = x => { // should be (x: number) => Base
return new Base();
return new Derived2();
}
var f9: (x: number) => any = x => { // should be (x: number) => Base
return new Base();
return new Derived();
return new Derived2();
}
var f10: (x: number) => any = x => { // should be (x: number) => Derived | Derived1
return new Derived();
return new Derived2();
}
var f11: (x: number) => any = x => { // should be (x: number) => Base | AnotherClass
return new Base();
return new AnotherClass();
}
var f12: (x: number) => any = x => { // should be (x: number) => Base | AnotherClass
return new Base();
return; // should be ignored
return new AnotherClass();
}
@@ -0,0 +1,15 @@
// basic valid forms of union literals
var simpleUnion: string | number;
var unionOfUnion: string | number | boolean;
var arrayOfUnions: (string | number)[];
var arrayOfUnions: Array<string | number>;
var unionOfFunctionType: (() => string) | (() => number);
var unionOfFunctionType: { (): string } | { (): number };
var unionOfFunctionType: () => string | number;
var unionOfConstructorType: (new () => string) | (new () => number);
var unionOfConstructorType: { new (): string } | { new (): number };
var unionOfConstructorType: new () => string | number;
@@ -15,13 +15,17 @@ var classCDTuple: [C, D] = [new C(), new D()];
var interfaceIITuple = <[I, I]>classCDTuple;
var classCDATuple = <[C, D, A]>classCDTuple;
var eleFromCDA1 = classCDATuple[2]; // A
var eleFromCDA2 = classCDATuple[5]; // {}
var eleFromCDA2 = classCDATuple[5]; // C | D | A
var t10: [E1, E2] = [E1.one, E2.one];
var t11 = <[number, number]>t10;
var array1 = <{}[]>emptyObjTuple;
var unionTuple: [C, string | number] = [new C(), "foo"];
var unionTuple2: [C, string | number, D] = [new C(), "foo", new D()];
var unionTuple3: [number, string| number] = [10, "foo"];
var unionTuple4 = <[number, number]>unionTuple3;
// error
var t3 = <[number, number]>numStrTuple;
var t9 = <[A, I]>classCDTuple;
var array1 = <number[]>numStrTuple;
t4[2] = 10;
t4[2] = 10;
@@ -4,6 +4,13 @@ var numStrTuple2: [number, string] = [5, "foo", true];
var numStrBoolTuple: [number, string, boolean] = [5, "foo", true];
var objNumTuple: [{ a: string }, number] = [{ a: "world" }, 5];
var strTupleTuple: [string, [number, {}]] = ["bar", [5, { x: 1, y: 1 }]];
class C { }
class D { }
var unionTuple: [C, string | number] = [new C(), "foo"];
var unionTuple1: [C, string | number] = [new C(), "foo"];
var unionTuple2: [C, string | number, D] = [new C(), "foo", new D()];
var unionTuple3: [number, string| number] = [10, "foo"];
numStrTuple = numStrTuple2;
numStrTuple = numStrBoolTuple;
@@ -11,3 +18,8 @@ numStrTuple = numStrBoolTuple;
objNumTuple = [ {}, 5];
numStrBoolTuple = numStrTuple;
var strStrTuple: [string, string] = ["foo", "bar", 5];
unionTuple = unionTuple1;
unionTuple = unionTuple2;
unionTuple2 = unionTuple;
numStrTuple = unionTuple3;
@@ -1,15 +1,32 @@
var strNumTuple: [string, number] = ["foo", 10];
var numTupleTuple: [number, [string, number]] = [10, ["bar", 20]];
var unionTuple1: [number, string| number] = [10, "foo"];
var unionTuple2: [boolean, string| number] = [true, "foo"];
// no error
var idx0 = 0;
var idx1 = 1;
var ele10 = strNumTuple[0]; // string
var ele11 = strNumTuple[1]; // number
var ele12 = strNumTuple[2]; // {}
var ele13 = strNumTuple[idx0]; // {}
var ele14 = strNumTuple[idx1]; // {}
var ele12 = strNumTuple[2]; // string | number
var ele13 = strNumTuple[idx0]; // string | number
var ele14 = strNumTuple[idx1]; // string | number
var ele15 = strNumTuple["0"]; // string
var ele16 = strNumTuple["1"]; // number
var strNumTuple1 = numTupleTuple[1]; //[string, number];
var ele17 = numTupleTuple[2]; // {}
var ele17 = numTupleTuple[2]; // number | [string, number]
var eleUnion10 = unionTuple1[0]; // number
var eleUnion11 = unionTuple1[1]; // string | number
var eleUnion12 = unionTuple1[2]; // string | number
var eleUnion13 = unionTuple1[idx0]; // string | number
var eleUnion14 = unionTuple1[idx1]; // string | number
var eleUnion15 = unionTuple1["0"]; // number
var eleUnion16 = unionTuple1["1"]; // string | number
var eleUnion20 = unionTuple2[0]; // boolean
var eleUnion21 = unionTuple2[1]; // string | number
var eleUnion22 = unionTuple2[2]; // string | number | boolean
var eleUnion23 = unionTuple2[idx0]; // string | number | boolean
var eleUnion24 = unionTuple2[idx1]; // string | number | boolean
var eleUnion25 = unionTuple2["0"]; // boolean
var eleUnion26 = unionTuple2["1"]; // string | number
@@ -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
}
@@ -0,0 +1,52 @@
enum E { e1, e2 }
interface I8 { [x: string]: number[]; }
class A { foo: number; }
class A2<T> { foo: T; }
function f() { }
module f { export var bar = 1; }
class c { baz: string }
module c { export var bar = 1; }
// A type T is a subtype of a union type U if T is a subtype of any type in U.
interface I1<T> {
[x: string]: string | number;
foo: any; // ok
foo2: string; // ok
foo3: number; // ok
foo4: boolean; // error
foo5: E; // ok - subtype of number
foo6: Date; // error
foo7: RegExp; // error
foo8: { bar: number }; // error
foo9: I8; // error
foo10: A; // error
foo11: A2<number>; // error
foo12: (x) => number; //error
foo13: <T>(x: T) => T; // error
foo14: typeof f; // error
foo15: typeof c; // error
foo16: T; // error
foo17: Object; // error
foo18: {}; // error
}
interface I2<T> {
[x: string]: E | number;
foo: any; // ok
foo2: string; // error
foo3: number; // ok
foo4: boolean; // error
foo5: E; // ok
foo6: Date; // error
foo7: RegExp; // error
foo8: { bar: number }; // error
foo9: I8; // error
foo10: A; // error
foo11: A2<number>; // error
foo12: (x) => number; //error
foo13: <T>(x: T) => T; // error
foo14: typeof f; // error
foo15: typeof c; // error
foo16: T; // error
foo17: Object; // error
foo18: {}; // error
}
@@ -0,0 +1,143 @@
enum e {
e1,
e2
}
// A union type U is a subtype of a type T if each type in U is a subtype of T
interface I {
[x: string]: any;
foo: string | number; // ok
foo2: e | number; // ok
}
interface I2 {
[x: string]: number;
// S is union type and each constituent type of S is a subtype of T
foo: string | number; // error string is not subtype of number
foo2: e | number; // ok e and number both subtype of number
}
interface I3 {
[x: string]: string;
foo: string | number; // error numer is not subtype of string
foo2: e | number; // error e and number both not subtype of string
}
// error cases
interface I4 {
[x: string]: boolean;
foo: string | number;
foo2: e | number;
}
interface I5 {
[x: string]: Date;
foo: string | number;
foo2: e | number;
}
interface I6 {
[x: string]: RegExp;
foo: string | number;
foo2: e | number;
}
interface I7 {
[x: string]: { bar: number };
foo: string | number;
foo2: e | number;
}
interface I8 {
[x: string]: number[];
foo: string | number;
foo2: e | number;
}
interface I9 {
[x: string]: I8;
foo: string | number;
foo2: e | number;
}
class A { foo: number; }
interface I10 {
[x: string]: A;
foo: string | number;
foo2: e | number;
}
class A2<T> { foo: T; }
interface I11 {
[x: string]: A2<number>;
foo: string | number;
foo2: e | number;
}
interface I12 {
[x: string]: (x) => number;
foo: string | number;
foo2: e | number;
}
interface I13 {
[x: string]: <T>(x: T) => T;
foo: string | number;
foo2: e | number;
}
enum E2 { A }
interface I14 {
[x: string]: E2;
foo: string | number;
foo2: e | number;
}
function f() { }
module f {
export var bar = 1;
}
interface I15 {
[x: string]: typeof f;
foo: string | number;
foo2: e | number;
}
class c { baz: string }
module c {
export var bar = 1;
}
interface I16 {
[x: string]: typeof c;
foo: string | number;
foo2: e | number;
}
interface I17<T> {
[x: string]: T;
foo: string | number;
foo2: e | number;
}
interface I19 {
[x: string]: Object;
foo: string | number;
foo2: e | number;
}
interface I20 {
[x: string]: {};
foo: string | number;
foo2: e | number;
}
@@ -0,0 +1,8 @@
// Two types are considered identical when
// they are union types with identical sets of constituent types, or
var strOrNum: string | boolean;
var strOrNum: boolean | string;
var strOrNum: boolean | string | boolean;
var strOrNum: string; // error
var strOrNum: boolean; // error
var strOrNum: number; // error
@@ -0,0 +1,70 @@
var numOrDate: number | Date;
var strOrBoolean: string | boolean;
var strOrNum: string | number;
// If each type in U has call signatures and the sets of call signatures are identical ignoring return types,
// U has the same set of call signatures, but with return types that are unions of the return types of the respective call signatures from each type in U.
var unionOfDifferentReturnType: { (a: number): number; } | { (a: number): Date; };
numOrDate = unionOfDifferentReturnType(10);
strOrBoolean = unionOfDifferentReturnType("hello"); // error
unionOfDifferentReturnType1(true); // error in type of parameter
var unionOfDifferentReturnType1: { (a: number): number; (a: string): string; } | { (a: number): Date; (a: string): boolean; };
numOrDate = unionOfDifferentReturnType1(10);
strOrBoolean = unionOfDifferentReturnType1("hello");
unionOfDifferentReturnType1(true); // error in type of parameter
unionOfDifferentReturnType1(); // error missing parameter
var unionOfDifferentParameterTypes: { (a: number): number; } | { (a: string): Date; };
unionOfDifferentParameterTypes(10);// error - no call signatures
unionOfDifferentParameterTypes("hello");// error - no call signatures
unionOfDifferentParameterTypes();// error - no call signatures
var unionOfDifferentNumberOfSignatures: { (a: number): number; } | { (a: number): Date; (a: string): boolean; };
unionOfDifferentNumberOfSignatures(); // error - no call signatures
unionOfDifferentNumberOfSignatures(10); // error - no call signatures
unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
var unionWithDifferentParameterCount: { (a: string): string; } | { (a: string, b: number): number; } ;
unionWithDifferentParameterCount();// no call signature
unionWithDifferentParameterCount("hello");// no call signature
unionWithDifferentParameterCount("hello", 10);// no call signature
var unionWithOptionalParameter1: { (a: string, b?: number): string; } | { (a: string, b?: number): number; };
strOrNum = unionWithOptionalParameter1('hello');
strOrNum = unionWithOptionalParameter1('hello', 10);
strOrNum = unionWithOptionalParameter1('hello', "hello"); // error in parameter type
strOrNum = unionWithOptionalParameter1(); // error
var unionWithOptionalParameter2: { (a: string, b?: number): string; } | { (a: string, b: number): number };
strOrNum = unionWithOptionalParameter2('hello'); // error no call signature
strOrNum = unionWithOptionalParameter2('hello', 10); // error no call signature
strOrNum = unionWithOptionalParameter2('hello', "hello"); // error no call signature
strOrNum = unionWithOptionalParameter2(); // error no call signature
var unionWithOptionalParameter3: { (a: string, b?: number): string; } | { (a: string): number; };
strOrNum = unionWithOptionalParameter3('hello'); // error no call signature
strOrNum = unionWithOptionalParameter3('hello', 10); // error no call signature
strOrNum = unionWithOptionalParameter3('hello', "hello"); // error no call signature
strOrNum = unionWithOptionalParameter3(); // error no call signature
var unionWithRestParameter1: { (a: string, ...b: number[]): string; } | { (a: string, ...b: number[]): number };
strOrNum = unionWithRestParameter1('hello');
strOrNum = unionWithRestParameter1('hello', 10);
strOrNum = unionWithRestParameter1('hello', 10, 11);
strOrNum = unionWithRestParameter1('hello', "hello"); // error in parameter type
strOrNum = unionWithRestParameter1(); // error
var unionWithRestParameter2: { (a: string, ...b: number[]): string; } | { (a: string, b: number): number };
strOrNum = unionWithRestParameter2('hello'); // error no call signature
strOrNum = unionWithRestParameter2('hello', 10); // error no call signature
strOrNum = unionWithRestParameter2('hello', 10, 11); // error no call signature
strOrNum = unionWithRestParameter2('hello', "hello"); // error no call signature
strOrNum = unionWithRestParameter2(); // error no call signature
var unionWithRestParameter3: { (a: string, ...b: number[]): string; } | { (a: string): number };
strOrNum = unionWithRestParameter3('hello'); // error no call signature
strOrNum = unionWithRestParameter3('hello', 10); // error no call signature
strOrNum = unionWithRestParameter3('hello', 10, 11); // error no call signature
strOrNum = unionWithRestParameter3('hello', "hello"); // error no call signature
strOrNum = unionWithRestParameter3(); // error no call signature
@@ -0,0 +1,70 @@
var numOrDate: number | Date;
var strOrBoolean: string | boolean;
var strOrNum: string | number;
// If each type in U has construct signatures and the sets of construct signatures are identical ignoring return types,
// U has the same set of construct signatures, but with return types that are unions of the return types of the respective construct signatures from each type in U.
var unionOfDifferentReturnType: { new (a: number): number; } | { new (a: number): Date; };
numOrDate = new unionOfDifferentReturnType(10);
strOrBoolean = new unionOfDifferentReturnType("hello"); // error
new unionOfDifferentReturnType1(true); // error in type of parameter
var unionOfDifferentReturnType1: { new (a: number): number; new (a: string): string; } | { new (a: number): Date; new (a: string): boolean; };
numOrDate = new unionOfDifferentReturnType1(10);
strOrBoolean = new unionOfDifferentReturnType1("hello");
new unionOfDifferentReturnType1(true); // error in type of parameter
new unionOfDifferentReturnType1(); // error missing parameter
var unionOfDifferentParameterTypes: { new (a: number): number; } | { new (a: string): Date; };
new unionOfDifferentParameterTypes(10);// error - no call signatures
new unionOfDifferentParameterTypes("hello");// error - no call signatures
new unionOfDifferentParameterTypes();// error - no call signatures
var unionOfDifferentNumberOfSignatures: { new (a: number): number; } | { new (a: number): Date; new (a: string): boolean; };
new unionOfDifferentNumberOfSignatures(); // error - no call signatures
new unionOfDifferentNumberOfSignatures(10); // error - no call signatures
new unionOfDifferentNumberOfSignatures("hello"); // error - no call signatures
var unionWithDifferentParameterCount: { new (a: string): string; } | { new (a: string, b: number): number; };
new unionWithDifferentParameterCount();// no call signature
new unionWithDifferentParameterCount("hello");// no call signature
new unionWithDifferentParameterCount("hello", 10);// no call signature
var unionWithOptionalParameter1: { new (a: string, b?: number): string; } | { new (a: string, b?: number): number; };
strOrNum = new unionWithOptionalParameter1('hello');
strOrNum = new unionWithOptionalParameter1('hello', 10);
strOrNum = new unionWithOptionalParameter1('hello', "hello"); // error in parameter type
strOrNum = new unionWithOptionalParameter1(); // error
var unionWithOptionalParameter2: { new (a: string, b?: number): string; } | { new (a: string, b: number): number };
strOrNum = new unionWithOptionalParameter2('hello'); // error no call signature
strOrNum = new unionWithOptionalParameter2('hello', 10); // error no call signature
strOrNum = new unionWithOptionalParameter2('hello', "hello"); // error no call signature
strOrNum = new unionWithOptionalParameter2(); // error no call signature
var unionWithOptionalParameter3: { new (a: string, b?: number): string; } | { new (a: string): number; };
strOrNum = new unionWithOptionalParameter3('hello'); // error no call signature
strOrNum = new unionWithOptionalParameter3('hello', 10); // error no call signature
strOrNum = new unionWithOptionalParameter3('hello', "hello"); // error no call signature
strOrNum = new unionWithOptionalParameter3(); // error no call signature
var unionWithRestParameter1: { new (a: string, ...b: number[]): string; } | { new (a: string, ...b: number[]): number };
strOrNum = new unionWithRestParameter1('hello');
strOrNum = new unionWithRestParameter1('hello', 10);
strOrNum = new unionWithRestParameter1('hello', 10, 11);
strOrNum = new unionWithRestParameter1('hello', "hello"); // error in parameter type
strOrNum = new unionWithRestParameter1(); // error
var unionWithRestParameter2: { new (a: string, ...b: number[]): string; } | { new (a: string, b: number): number };
strOrNum = new unionWithRestParameter2('hello'); // error no call signature
strOrNum = new unionWithRestParameter2('hello', 10); // error no call signature
strOrNum = new unionWithRestParameter2('hello', 10, 11); // error no call signature
strOrNum = new unionWithRestParameter2('hello', "hello"); // error no call signature
strOrNum = new unionWithRestParameter2(); // error no call signature
var unionWithRestParameter3: { new (a: string, ...b: number[]): string; } | { new (a: string): number };
strOrNum = new unionWithRestParameter3('hello'); // error no call signature
strOrNum = new unionWithRestParameter3('hello', 10); // error no call signature
strOrNum = new unionWithRestParameter3('hello', 10, 11); // error no call signature
strOrNum = new unionWithRestParameter3('hello', "hello"); // error no call signature
strOrNum = new unionWithRestParameter3(); // error no call signature
@@ -0,0 +1,18 @@
// A | B is equivalent to A if B is a subtype of A
class C { }
class D extends C { foo() { } }
var x: C;
var x : C | D;
// A | B is equivalent to B | A.
var y: string | number;
var y : number | string;
// AB | C is equivalent to A | BC, where AB is A | B and BC is B | C.
var z : string | number | boolean;
var z : (string | number) | boolean;
var z : string | (number | boolean);
var AB : string | number;
var BC : number | boolean;
var z1: typeof AB | boolean;
var z1: string | typeof BC;
@@ -0,0 +1,23 @@
// The resulting type an array literal expression is determined as follows:
// If the array literal is empty, the resulting type is an array type with the element type Undefined.
// Otherwise, if the array literal is contextually typed by a type that has a property with the numeric name 0, the resulting type is a tuple type constructed from the types of the element expressions.
// Otherwise, the resulting type is an array type with an element type that is the union of the types of the element expressions.
var arr1 = [1, 2]; // number[]
var arr2 = ["hello", true]; // (string | number)[]
var arr3Tuple: [number, string] = [3, "three"]; // [number, string]
var arr4Tuple: [number, string] = [3, "three", "hello"]; // [number, string, string]
var arrEmpty = [];
var arr5Tuple: {
0: string;
5: number;
} = ["hello", true, false, " hello", true, 10, "any"]; // Tuple
class C { foo() { } }
class D { foo2() { } }
class E extends C { foo3() { } }
class F extends C { foo4() { } }
var c: C, d: D, e: E, f: F;
var arr6 = [c, d]; // (C | D)[]
var arr7 = [c, d, e]; // (C | D)[]
var arr8 = [c, e]; // C[]
var arr9 = [e, f]; // (E|F)[]
@@ -0,0 +1,23 @@
var numOrDate: number | Date;
var anyVar: number;
// If each type in U has a string index signature,
// U has a string index signature of a union type of the types of the string index signatures from each type in U.
var unionOfDifferentReturnType: { [a: string]: number; } | { [a: string]: Date; };
numOrDate = unionOfDifferentReturnType["hello"]; // number | Date
numOrDate = unionOfDifferentReturnType[10]; // number | Date
var unionOfTypesWithAndWithoutStringSignature: { [a: string]: number; } | boolean;
anyVar = unionOfTypesWithAndWithoutStringSignature["hello"]; // any
anyVar = unionOfTypesWithAndWithoutStringSignature[10]; // any
// If each type in U has a numeric index signature,
// U has a numeric index signature of a union type of the types of the numeric index signatures from each type in U.
var unionOfDifferentReturnType1: { [a: number]: number; } | { [a: number]: Date; };
numOrDate = unionOfDifferentReturnType1["hello"]; // any
numOrDate = unionOfDifferentReturnType1[10]; // number | Date
var unionOfTypesWithAndWithoutStringSignature1: { [a: number]: number; } | boolean;
anyVar = unionOfTypesWithAndWithoutStringSignature1["hello"]; // any
anyVar = unionOfTypesWithAndWithoutStringSignature1[10]; // any
@@ -0,0 +1,54 @@
interface I1<T> {
commonMethodType(a: string): string;
commonPropertyType: string;
commonMethodDifferentParameterType(a: string): string;
commonMethodDifferentReturnType(a: string): string;
commonPropertyDifferenType: string;
commonMethodWithTypeParameter(a: T): T;
commonMethodWithOwnTypeParameter<U>(a: U): U;
methodOnlyInI1(a: string): string;
propertyOnlyInI1: string;
}
interface I2<T> {
commonMethodType(a: string): string;
commonPropertyType: string;
commonMethodDifferentParameterType(a: number): number;
commonMethodDifferentReturnType(a: string): number;
commonPropertyDifferenType: number;
commonMethodWithTypeParameter(a: T): T;
commonMethodWithOwnTypeParameter<U>(a: U): U;
methodOnlyInI2(a: string): string;
propertyOnlyInI2: string;
}
// a union type U has those members that are present in every one of its constituent types,
// with types that are unions of the respective members in the constituent types
var x : I1<number> | I2<number>;
var str: string;
var num: number;
var strOrNum: string | number;
// If each type in U has a property P, U has a property P of a union type of the types of P from each type in U.
str = x.commonPropertyType; // string
str = x.commonMethodType(str); // (a: string) => string so result should be string
strOrNum = x.commonPropertyDifferenType;
strOrNum = x.commonMethodDifferentReturnType(str); // string | union
x.commonMethodDifferentParameterType; // No error - property exists
x.commonMethodDifferentParameterType(strOrNum); // error - no call signatures because the type of this property is ((a: string) => string) | (a: number) => number
// and the call signatures arent identical
num = x.commonMethodWithTypeParameter(num);
num = x.commonMethodWithOwnTypeParameter(num);
str = x.commonMethodWithOwnTypeParameter(str);
strOrNum = x.commonMethodWithOwnTypeParameter(strOrNum);
x.propertyOnlyInI1; // error
x.propertyOnlyInI2; // error
x.methodOnlyInI1("hello"); // error
x.methodOnlyInI2(10); // error