Accept new baselines

This commit is contained in:
Anders Hejlsberg
2016-09-01 06:47:29 -07:00
parent b96f6cd84c
commit b5c2d5b111
39 changed files with 1309 additions and 415 deletions
@@ -15,7 +15,7 @@ interface IPromise<T> {
}
function f() {
>f : () => IPromise<void>
>f : () => IPromise<any>
if (true) return b();
>true : boolean
@@ -1,44 +1,26 @@
tests/cases/conformance/functions/functionImplementationErrors.ts(3,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(7,19): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(11,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(17,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(26,16): error TS2355: A function whose declared type is neither 'void' nor 'any' must return a value.
tests/cases/conformance/functions/functionImplementationErrors.ts(31,17): error TS2373: Initializer of parameter 'n' cannot reference identifier 'm' declared after it.
tests/cases/conformance/functions/functionImplementationErrors.ts(36,17): error TS2373: Initializer of parameter 'n' cannot reference identifier 'm' declared after it.
tests/cases/conformance/functions/functionImplementationErrors.ts(50,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(54,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(58,11): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(62,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(66,11): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/functions/functionImplementationErrors.ts(70,11): error TS2354: No best common type exists among return expressions.
==== tests/cases/conformance/functions/functionImplementationErrors.ts (13 errors) ====
==== tests/cases/conformance/functions/functionImplementationErrors.ts (3 errors) ====
// FunctionExpression with no return type annotation with multiple return statements with unrelated types
var f1 = function () {
~~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
return '';
return 3;
};
var f2 = function x() {
~
!!! error TS2354: No best common type exists among return expressions.
return '';
return 3;
};
var f3 = () => {
~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
return '';
return 3;
};
// FunctionExpression with no return type annotation with return branch of number[] and other of string[]
var f4 = function () {
~~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
if (true) {
return [''];
} else {
@@ -78,38 +60,26 @@ tests/cases/conformance/functions/functionImplementationErrors.ts(70,11): error
class Derived1 extends Base { private m; }
class Derived2 extends Base { private n; }
function f8() {
~~
!!! error TS2354: No best common type exists among return expressions.
return new Derived1();
return new Derived2();
}
var f9 = function () {
~~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
return new Derived1();
return new Derived2();
};
var f10 = () => {
~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
return new Derived1();
return new Derived2();
};
function f11() {
~~~
!!! error TS2354: No best common type exists among return expressions.
return new Base();
return new AnotherClass();
}
var f12 = function () {
~~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
return new Base();
return new AnotherClass();
};
var f13 = () => {
~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
return new Base();
return new AnotherClass();
};
@@ -1,85 +0,0 @@
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts(5,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts(13,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts(23,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts(32,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts(44,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts(49,10): error TS2354: No best common type exists among return expressions.
==== tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts (6 errors) ====
// return type of a function with multiple returns is the BCT of each return statement
// it is an error if there is no single BCT, these are error cases
function f1() {
~~
!!! error TS2354: No best common type exists among return expressions.
if (true) {
return 1;
} else {
return '';
}
}
function f2() {
~~
!!! error TS2354: No best common type exists among return expressions.
if (true) {
return 1;
} else if (false) {
return 2;
} else {
return '';
}
}
function f3() {
~~
!!! error TS2354: No best common type exists among return expressions.
try {
return 1;
}
catch (e) {
return '';
}
}
function f4() {
~~
!!! error TS2354: No best common type exists among return expressions.
try {
return 1;
}
catch (e) {
}
finally {
return '';
}
}
function f5() {
~~
!!! error TS2354: No best common type exists among return expressions.
return 1;
return '';
}
function f6<T, U>(x: T, y:U) {
~~
!!! error TS2354: No best common type exists among return expressions.
if (true) {
return x;
} else {
return y;
}
}
function f8<T extends U, U extends V, V>(x: T, y: U) {
if (true) {
return x;
} else {
return y;
}
}
@@ -0,0 +1,103 @@
=== tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts ===
// return type of a function with multiple returns is the BCT of each return statement
// it is an error if there is no single BCT, these are error cases
function f1() {
>f1 : Symbol(f1, Decl(functionWithMultipleReturnStatements.ts, 0, 0))
if (true) {
return 1;
} else {
return '';
}
}
function f2() {
>f2 : Symbol(f2, Decl(functionWithMultipleReturnStatements.ts, 10, 1))
if (true) {
return 1;
} else if (false) {
return 2;
} else {
return '';
}
}
function f3() {
>f3 : Symbol(f3, Decl(functionWithMultipleReturnStatements.ts, 20, 1))
try {
return 1;
}
catch (e) {
>e : Symbol(e, Decl(functionWithMultipleReturnStatements.ts, 26, 11))
return '';
}
}
function f4() {
>f4 : Symbol(f4, Decl(functionWithMultipleReturnStatements.ts, 29, 1))
try {
return 1;
}
catch (e) {
>e : Symbol(e, Decl(functionWithMultipleReturnStatements.ts, 35, 11))
}
finally {
return '';
}
}
function f5() {
>f5 : Symbol(f5, Decl(functionWithMultipleReturnStatements.ts, 41, 1))
return 1;
return '';
}
function f6<T, U>(x: T, y:U) {
>f6 : Symbol(f6, Decl(functionWithMultipleReturnStatements.ts, 46, 1))
>T : Symbol(T, Decl(functionWithMultipleReturnStatements.ts, 48, 12))
>U : Symbol(U, Decl(functionWithMultipleReturnStatements.ts, 48, 14))
>x : Symbol(x, Decl(functionWithMultipleReturnStatements.ts, 48, 18))
>T : Symbol(T, Decl(functionWithMultipleReturnStatements.ts, 48, 12))
>y : Symbol(y, Decl(functionWithMultipleReturnStatements.ts, 48, 23))
>U : Symbol(U, Decl(functionWithMultipleReturnStatements.ts, 48, 14))
if (true) {
return x;
>x : Symbol(x, Decl(functionWithMultipleReturnStatements.ts, 48, 18))
} else {
return y;
>y : Symbol(y, Decl(functionWithMultipleReturnStatements.ts, 48, 23))
}
}
function f8<T extends U, U extends V, V>(x: T, y: U) {
>f8 : Symbol(f8, Decl(functionWithMultipleReturnStatements.ts, 54, 1))
>T : Symbol(T, Decl(functionWithMultipleReturnStatements.ts, 56, 12))
>U : Symbol(U, Decl(functionWithMultipleReturnStatements.ts, 56, 24))
>U : Symbol(U, Decl(functionWithMultipleReturnStatements.ts, 56, 24))
>V : Symbol(V, Decl(functionWithMultipleReturnStatements.ts, 56, 37))
>V : Symbol(V, Decl(functionWithMultipleReturnStatements.ts, 56, 37))
>x : Symbol(x, Decl(functionWithMultipleReturnStatements.ts, 56, 41))
>T : Symbol(T, Decl(functionWithMultipleReturnStatements.ts, 56, 12))
>y : Symbol(y, Decl(functionWithMultipleReturnStatements.ts, 56, 46))
>U : Symbol(U, Decl(functionWithMultipleReturnStatements.ts, 56, 24))
if (true) {
return x;
>x : Symbol(x, Decl(functionWithMultipleReturnStatements.ts, 56, 41))
} else {
return y;
>y : Symbol(y, Decl(functionWithMultipleReturnStatements.ts, 56, 46))
}
}
@@ -0,0 +1,128 @@
=== tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements.ts ===
// return type of a function with multiple returns is the BCT of each return statement
// it is an error if there is no single BCT, these are error cases
function f1() {
>f1 : () => string | number
if (true) {
>true : boolean
return 1;
>1 : number
} else {
return '';
>'' : string
}
}
function f2() {
>f2 : () => string | number
if (true) {
>true : boolean
return 1;
>1 : number
} else if (false) {
>false : boolean
return 2;
>2 : number
} else {
return '';
>'' : string
}
}
function f3() {
>f3 : () => string | number
try {
return 1;
>1 : number
}
catch (e) {
>e : any
return '';
>'' : string
}
}
function f4() {
>f4 : () => string | number
try {
return 1;
>1 : number
}
catch (e) {
>e : any
}
finally {
return '';
>'' : string
}
}
function f5() {
>f5 : () => string | number
return 1;
>1 : number
return '';
>'' : string
}
function f6<T, U>(x: T, y:U) {
>f6 : <T, U>(x: T, y: U) => T | U
>T : T
>U : U
>x : T
>T : T
>y : U
>U : U
if (true) {
>true : boolean
return x;
>x : T
} else {
return y;
>y : U
}
}
function f8<T extends U, U extends V, V>(x: T, y: U) {
>f8 : <T extends U, U extends V, V>(x: T, y: U) => U
>T : T
>U : U
>U : U
>V : V
>V : V
>x : T
>T : T
>y : U
>U : U
if (true) {
>true : boolean
return x;
>x : T
} else {
return y;
>y : U
}
}
@@ -1,101 +0,0 @@
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements2.ts(59,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements2.ts(68,10): error TS2354: No best common type exists among return expressions.
==== tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements2.ts (2 errors) ====
// return type of a function with multiple returns is the BCT of each return statement
// no errors expected here
function f1() {
if (true) {
return 1;
} else {
return null;
}
}
function f2() {
if (true) {
return 1;
} else if (false) {
return null;
} else {
return 2;
}
}
function f4() {
try {
return 1;
}
catch (e) {
return undefined;
}
finally {
return 1;
}
}
function f5() {
return 1;
return new Object();
}
function f6<T>(x: T) {
if (true) {
return x;
} else {
return null;
}
}
//function f7<T extends U, U>(x: T, y: U) {
// if (true) {
// return x;
// } else {
// return y;
// }
//}
var a: { x: number; y?: number };
var b: { x: number; z?: number };
// returns typeof a
function f9() {
~~
!!! error TS2354: No best common type exists among return expressions.
if (true) {
return a;
} else {
return b;
}
}
// returns typeof b
function f10() {
~~~
!!! error TS2354: No best common type exists among return expressions.
if (true) {
return b;
} else {
return a;
}
}
// returns number => void
function f11() {
if (true) {
return (x: number) => { }
} else {
return (x: Object) => { }
}
}
// returns Object => void
function f12() {
if (true) {
return (x: Object) => { }
} else {
return (x: number) => { }
}
}
@@ -0,0 +1,142 @@
=== tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements2.ts ===
// return type of a function with multiple returns is the BCT of each return statement
// no errors expected here
function f1() {
>f1 : Symbol(f1, Decl(functionWithMultipleReturnStatements2.ts, 0, 0))
if (true) {
return 1;
} else {
return null;
}
}
function f2() {
>f2 : Symbol(f2, Decl(functionWithMultipleReturnStatements2.ts, 10, 1))
if (true) {
return 1;
} else if (false) {
return null;
} else {
return 2;
}
}
function f4() {
>f4 : Symbol(f4, Decl(functionWithMultipleReturnStatements2.ts, 20, 1))
try {
return 1;
}
catch (e) {
>e : Symbol(e, Decl(functionWithMultipleReturnStatements2.ts, 26, 11))
return undefined;
>undefined : Symbol(undefined)
}
finally {
return 1;
}
}
function f5() {
>f5 : Symbol(f5, Decl(functionWithMultipleReturnStatements2.ts, 32, 1))
return 1;
return new Object();
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
}
function f6<T>(x: T) {
>f6 : Symbol(f6, Decl(functionWithMultipleReturnStatements2.ts, 37, 1))
>T : Symbol(T, Decl(functionWithMultipleReturnStatements2.ts, 39, 12))
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 39, 15))
>T : Symbol(T, Decl(functionWithMultipleReturnStatements2.ts, 39, 12))
if (true) {
return x;
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 39, 15))
} else {
return null;
}
}
//function f7<T extends U, U>(x: T, y: U) {
// if (true) {
// return x;
// } else {
// return y;
// }
//}
var a: { x: number; y?: number };
>a : Symbol(a, Decl(functionWithMultipleReturnStatements2.ts, 55, 3))
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 55, 8))
>y : Symbol(y, Decl(functionWithMultipleReturnStatements2.ts, 55, 19))
var b: { x: number; z?: number };
>b : Symbol(b, Decl(functionWithMultipleReturnStatements2.ts, 56, 3))
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 56, 8))
>z : Symbol(z, Decl(functionWithMultipleReturnStatements2.ts, 56, 19))
// returns typeof a
function f9() {
>f9 : Symbol(f9, Decl(functionWithMultipleReturnStatements2.ts, 56, 33))
if (true) {
return a;
>a : Symbol(a, Decl(functionWithMultipleReturnStatements2.ts, 55, 3))
} else {
return b;
>b : Symbol(b, Decl(functionWithMultipleReturnStatements2.ts, 56, 3))
}
}
// returns typeof b
function f10() {
>f10 : Symbol(f10, Decl(functionWithMultipleReturnStatements2.ts, 64, 1))
if (true) {
return b;
>b : Symbol(b, Decl(functionWithMultipleReturnStatements2.ts, 56, 3))
} else {
return a;
>a : Symbol(a, Decl(functionWithMultipleReturnStatements2.ts, 55, 3))
}
}
// returns number => void
function f11() {
>f11 : Symbol(f11, Decl(functionWithMultipleReturnStatements2.ts, 73, 1))
if (true) {
return (x: number) => { }
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 78, 16))
} else {
return (x: Object) => { }
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 80, 16))
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
}
}
// returns Object => void
function f12() {
>f12 : Symbol(f12, Decl(functionWithMultipleReturnStatements2.ts, 82, 1))
if (true) {
return (x: Object) => { }
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 87, 16))
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
} else {
return (x: number) => { }
>x : Symbol(x, Decl(functionWithMultipleReturnStatements2.ts, 89, 16))
}
}
@@ -0,0 +1,176 @@
=== tests/cases/conformance/types/typeRelationships/bestCommonType/functionWithMultipleReturnStatements2.ts ===
// return type of a function with multiple returns is the BCT of each return statement
// no errors expected here
function f1() {
>f1 : () => number
if (true) {
>true : boolean
return 1;
>1 : number
} else {
return null;
>null : null
}
}
function f2() {
>f2 : () => number
if (true) {
>true : boolean
return 1;
>1 : number
} else if (false) {
>false : boolean
return null;
>null : null
} else {
return 2;
>2 : number
}
}
function f4() {
>f4 : () => number
try {
return 1;
>1 : number
}
catch (e) {
>e : any
return undefined;
>undefined : undefined
}
finally {
return 1;
>1 : number
}
}
function f5() {
>f5 : () => Object
return 1;
>1 : number
return new Object();
>new Object() : Object
>Object : ObjectConstructor
}
function f6<T>(x: T) {
>f6 : <T>(x: T) => T
>T : T
>x : T
>T : T
if (true) {
>true : boolean
return x;
>x : T
} else {
return null;
>null : null
}
}
//function f7<T extends U, U>(x: T, y: U) {
// if (true) {
// return x;
// } else {
// return y;
// }
//}
var a: { x: number; y?: number };
>a : { x: number; y?: number; }
>x : number
>y : number
var b: { x: number; z?: number };
>b : { x: number; z?: number; }
>x : number
>z : number
// returns typeof a
function f9() {
>f9 : () => { x: number; y?: number; } | { x: number; z?: number; }
if (true) {
>true : boolean
return a;
>a : { x: number; y?: number; }
} else {
return b;
>b : { x: number; z?: number; }
}
}
// returns typeof b
function f10() {
>f10 : () => { x: number; y?: number; } | { x: number; z?: number; }
if (true) {
>true : boolean
return b;
>b : { x: number; z?: number; }
} else {
return a;
>a : { x: number; y?: number; }
}
}
// returns number => void
function f11() {
>f11 : () => (x: number) => void
if (true) {
>true : boolean
return (x: number) => { }
>(x: number) => { } : (x: number) => void
>x : number
} else {
return (x: Object) => { }
>(x: Object) => { } : (x: Object) => void
>x : Object
>Object : Object
}
}
// returns Object => void
function f12() {
>f12 : () => (x: Object) => void
if (true) {
>true : boolean
return (x: Object) => { }
>(x: Object) => { } : (x: Object) => void
>x : Object
>Object : Object
} else {
return (x: number) => { }
>(x: number) => { } : (x: number) => void
>x : number
}
}
@@ -1,14 +0,0 @@
tests/cases/compiler/functionWithNoBestCommonType1.ts(2,10): error TS2354: No best common type exists among return expressions.
==== tests/cases/compiler/functionWithNoBestCommonType1.ts (1 errors) ====
function foo() {
~~~
!!! error TS2354: No best common type exists among return expressions.
return true;
return bar();
}
function bar(): void {
}
@@ -0,0 +1,13 @@
=== tests/cases/compiler/functionWithNoBestCommonType1.ts ===
function foo() {
>foo : Symbol(foo, Decl(functionWithNoBestCommonType1.ts, 0, 0))
return true;
return bar();
>bar : Symbol(bar, Decl(functionWithNoBestCommonType1.ts, 4, 1))
}
function bar(): void {
>bar : Symbol(bar, Decl(functionWithNoBestCommonType1.ts, 4, 1))
}
@@ -0,0 +1,16 @@
=== tests/cases/compiler/functionWithNoBestCommonType1.ts ===
function foo() {
>foo : () => boolean | void
return true;
>true : boolean
return bar();
>bar() : void
>bar : () => void
}
function bar(): void {
>bar : () => void
}
@@ -1,14 +0,0 @@
tests/cases/compiler/functionWithNoBestCommonType2.ts(2,9): error TS2354: No best common type exists among return expressions.
==== tests/cases/compiler/functionWithNoBestCommonType2.ts (1 errors) ====
var v = function () {
~~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
return true;
return bar();
};
function bar(): void {
}
@@ -0,0 +1,14 @@
=== tests/cases/compiler/functionWithNoBestCommonType2.ts ===
var v = function () {
>v : Symbol(v, Decl(functionWithNoBestCommonType2.ts, 1, 3))
return true;
return bar();
>bar : Symbol(bar, Decl(functionWithNoBestCommonType2.ts, 4, 2))
};
function bar(): void {
>bar : Symbol(bar, Decl(functionWithNoBestCommonType2.ts, 4, 2))
}
@@ -0,0 +1,18 @@
=== tests/cases/compiler/functionWithNoBestCommonType2.ts ===
var v = function () {
>v : () => boolean | void
>function () { return true; return bar();} : () => boolean | void
return true;
>true : boolean
return bar();
>bar() : void
>bar : () => void
};
function bar(): void {
>bar : () => void
}
@@ -1,16 +0,0 @@
tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck22.ts(4,11): error TS2504: No best common type exists among yield expressions.
==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck22.ts (1 errors) ====
class Foo { x: number }
class Bar extends Foo { y: string }
class Baz { z: number }
function* g3() {
~~
!!! error TS2504: No best common type exists among yield expressions.
yield;
yield new Bar;
yield new Baz;
yield *[new Bar];
yield *[new Baz];
}
@@ -0,0 +1,30 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck22.ts ===
class Foo { x: number }
>Foo : Symbol(Foo, Decl(generatorTypeCheck22.ts, 0, 0))
>x : Symbol(Foo.x, Decl(generatorTypeCheck22.ts, 0, 11))
class Bar extends Foo { y: string }
>Bar : Symbol(Bar, Decl(generatorTypeCheck22.ts, 0, 23))
>Foo : Symbol(Foo, Decl(generatorTypeCheck22.ts, 0, 0))
>y : Symbol(Bar.y, Decl(generatorTypeCheck22.ts, 1, 23))
class Baz { z: number }
>Baz : Symbol(Baz, Decl(generatorTypeCheck22.ts, 1, 35))
>z : Symbol(Baz.z, Decl(generatorTypeCheck22.ts, 2, 11))
function* g3() {
>g3 : Symbol(g3, Decl(generatorTypeCheck22.ts, 2, 23))
yield;
yield new Bar;
>Bar : Symbol(Bar, Decl(generatorTypeCheck22.ts, 0, 23))
yield new Baz;
>Baz : Symbol(Baz, Decl(generatorTypeCheck22.ts, 1, 35))
yield *[new Bar];
>Bar : Symbol(Bar, Decl(generatorTypeCheck22.ts, 0, 23))
yield *[new Baz];
>Baz : Symbol(Baz, Decl(generatorTypeCheck22.ts, 1, 35))
}
@@ -0,0 +1,42 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck22.ts ===
class Foo { x: number }
>Foo : Foo
>x : number
class Bar extends Foo { y: string }
>Bar : Bar
>Foo : Foo
>y : string
class Baz { z: number }
>Baz : Baz
>z : number
function* g3() {
>g3 : () => IterableIterator<Bar | Baz>
yield;
>yield : any
yield new Bar;
>yield new Bar : any
>new Bar : Bar
>Bar : typeof Bar
yield new Baz;
>yield new Baz : any
>new Baz : Baz
>Baz : typeof Baz
yield *[new Bar];
>yield *[new Bar] : any
>[new Bar] : Bar[]
>new Bar : Bar
>Bar : typeof Bar
yield *[new Baz];
>yield *[new Baz] : any
>[new Baz] : Baz[]
>new Baz : Baz
>Baz : typeof Baz
}
@@ -1,17 +0,0 @@
tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck23.ts(4,11): error TS2504: No best common type exists among yield expressions.
==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck23.ts (1 errors) ====
class Foo { x: number }
class Bar extends Foo { y: string }
class Baz { z: number }
function* g3() {
~~
!!! error TS2504: No best common type exists among yield expressions.
yield;
yield new Foo;
yield new Bar;
yield new Baz;
yield *[new Bar];
yield *[new Baz];
}
@@ -0,0 +1,33 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck23.ts ===
class Foo { x: number }
>Foo : Symbol(Foo, Decl(generatorTypeCheck23.ts, 0, 0))
>x : Symbol(Foo.x, Decl(generatorTypeCheck23.ts, 0, 11))
class Bar extends Foo { y: string }
>Bar : Symbol(Bar, Decl(generatorTypeCheck23.ts, 0, 23))
>Foo : Symbol(Foo, Decl(generatorTypeCheck23.ts, 0, 0))
>y : Symbol(Bar.y, Decl(generatorTypeCheck23.ts, 1, 23))
class Baz { z: number }
>Baz : Symbol(Baz, Decl(generatorTypeCheck23.ts, 1, 35))
>z : Symbol(Baz.z, Decl(generatorTypeCheck23.ts, 2, 11))
function* g3() {
>g3 : Symbol(g3, Decl(generatorTypeCheck23.ts, 2, 23))
yield;
yield new Foo;
>Foo : Symbol(Foo, Decl(generatorTypeCheck23.ts, 0, 0))
yield new Bar;
>Bar : Symbol(Bar, Decl(generatorTypeCheck23.ts, 0, 23))
yield new Baz;
>Baz : Symbol(Baz, Decl(generatorTypeCheck23.ts, 1, 35))
yield *[new Bar];
>Bar : Symbol(Bar, Decl(generatorTypeCheck23.ts, 0, 23))
yield *[new Baz];
>Baz : Symbol(Baz, Decl(generatorTypeCheck23.ts, 1, 35))
}
@@ -0,0 +1,47 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck23.ts ===
class Foo { x: number }
>Foo : Foo
>x : number
class Bar extends Foo { y: string }
>Bar : Bar
>Foo : Foo
>y : string
class Baz { z: number }
>Baz : Baz
>z : number
function* g3() {
>g3 : () => IterableIterator<Foo | Baz>
yield;
>yield : any
yield new Foo;
>yield new Foo : any
>new Foo : Foo
>Foo : typeof Foo
yield new Bar;
>yield new Bar : any
>new Bar : Bar
>Bar : typeof Bar
yield new Baz;
>yield new Baz : any
>new Baz : Baz
>Baz : typeof Baz
yield *[new Bar];
>yield *[new Bar] : any
>[new Bar] : Bar[]
>new Bar : Bar
>Bar : typeof Bar
yield *[new Baz];
>yield *[new Baz] : any
>[new Baz] : Baz[]
>new Baz : Baz
>Baz : typeof Baz
}
@@ -1,17 +0,0 @@
tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck24.ts(4,11): error TS2504: No best common type exists among yield expressions.
==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck24.ts (1 errors) ====
class Foo { x: number }
class Bar extends Foo { y: string }
class Baz { z: number }
function* g3() {
~~
!!! error TS2504: No best common type exists among yield expressions.
yield;
yield * [new Foo];
yield new Bar;
yield new Baz;
yield *[new Bar];
yield *[new Baz];
}
@@ -0,0 +1,33 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck24.ts ===
class Foo { x: number }
>Foo : Symbol(Foo, Decl(generatorTypeCheck24.ts, 0, 0))
>x : Symbol(Foo.x, Decl(generatorTypeCheck24.ts, 0, 11))
class Bar extends Foo { y: string }
>Bar : Symbol(Bar, Decl(generatorTypeCheck24.ts, 0, 23))
>Foo : Symbol(Foo, Decl(generatorTypeCheck24.ts, 0, 0))
>y : Symbol(Bar.y, Decl(generatorTypeCheck24.ts, 1, 23))
class Baz { z: number }
>Baz : Symbol(Baz, Decl(generatorTypeCheck24.ts, 1, 35))
>z : Symbol(Baz.z, Decl(generatorTypeCheck24.ts, 2, 11))
function* g3() {
>g3 : Symbol(g3, Decl(generatorTypeCheck24.ts, 2, 23))
yield;
yield * [new Foo];
>Foo : Symbol(Foo, Decl(generatorTypeCheck24.ts, 0, 0))
yield new Bar;
>Bar : Symbol(Bar, Decl(generatorTypeCheck24.ts, 0, 23))
yield new Baz;
>Baz : Symbol(Baz, Decl(generatorTypeCheck24.ts, 1, 35))
yield *[new Bar];
>Bar : Symbol(Bar, Decl(generatorTypeCheck24.ts, 0, 23))
yield *[new Baz];
>Baz : Symbol(Baz, Decl(generatorTypeCheck24.ts, 1, 35))
}
@@ -0,0 +1,48 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck24.ts ===
class Foo { x: number }
>Foo : Foo
>x : number
class Bar extends Foo { y: string }
>Bar : Bar
>Foo : Foo
>y : string
class Baz { z: number }
>Baz : Baz
>z : number
function* g3() {
>g3 : () => IterableIterator<Foo | Baz>
yield;
>yield : any
yield * [new Foo];
>yield * [new Foo] : any
>[new Foo] : Foo[]
>new Foo : Foo
>Foo : typeof Foo
yield new Bar;
>yield new Bar : any
>new Bar : Bar
>Bar : typeof Bar
yield new Baz;
>yield new Baz : any
>new Baz : Baz
>Baz : typeof Baz
yield *[new Bar];
>yield *[new Bar] : any
>[new Bar] : Bar[]
>new Bar : Bar
>Bar : typeof Bar
yield *[new Baz];
>yield *[new Baz] : any
>[new Baz] : Baz[]
>new Baz : Baz
>Baz : typeof Baz
}
@@ -1,12 +0,0 @@
tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck52.ts(3,11): error TS2504: No best common type exists among yield expressions.
==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck52.ts (1 errors) ====
class Foo { x: number }
class Baz { z: number }
function* g() {
~
!!! error TS2504: No best common type exists among yield expressions.
yield new Foo;
yield new Baz;
}
@@ -0,0 +1,18 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck52.ts ===
class Foo { x: number }
>Foo : Symbol(Foo, Decl(generatorTypeCheck52.ts, 0, 0))
>x : Symbol(Foo.x, Decl(generatorTypeCheck52.ts, 0, 11))
class Baz { z: number }
>Baz : Symbol(Baz, Decl(generatorTypeCheck52.ts, 0, 23))
>z : Symbol(Baz.z, Decl(generatorTypeCheck52.ts, 1, 11))
function* g() {
>g : Symbol(g, Decl(generatorTypeCheck52.ts, 1, 23))
yield new Foo;
>Foo : Symbol(Foo, Decl(generatorTypeCheck52.ts, 0, 0))
yield new Baz;
>Baz : Symbol(Baz, Decl(generatorTypeCheck52.ts, 0, 23))
}
@@ -0,0 +1,22 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck52.ts ===
class Foo { x: number }
>Foo : Foo
>x : number
class Baz { z: number }
>Baz : Baz
>z : number
function* g() {
>g : () => IterableIterator<Foo | Baz>
yield new Foo;
>yield new Foo : any
>new Foo : Foo
>Foo : typeof Foo
yield new Baz;
>yield new Baz : any
>new Baz : Baz
>Baz : typeof Baz
}
@@ -1,12 +0,0 @@
tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck53.ts(3,11): error TS2504: No best common type exists among yield expressions.
==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck53.ts (1 errors) ====
class Foo { x: number }
class Baz { z: number }
function* g() {
~
!!! error TS2504: No best common type exists among yield expressions.
yield new Foo;
yield* [new Baz];
}
@@ -0,0 +1,18 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck53.ts ===
class Foo { x: number }
>Foo : Symbol(Foo, Decl(generatorTypeCheck53.ts, 0, 0))
>x : Symbol(Foo.x, Decl(generatorTypeCheck53.ts, 0, 11))
class Baz { z: number }
>Baz : Symbol(Baz, Decl(generatorTypeCheck53.ts, 0, 23))
>z : Symbol(Baz.z, Decl(generatorTypeCheck53.ts, 1, 11))
function* g() {
>g : Symbol(g, Decl(generatorTypeCheck53.ts, 1, 23))
yield new Foo;
>Foo : Symbol(Foo, Decl(generatorTypeCheck53.ts, 0, 0))
yield* [new Baz];
>Baz : Symbol(Baz, Decl(generatorTypeCheck53.ts, 0, 23))
}
@@ -0,0 +1,23 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck53.ts ===
class Foo { x: number }
>Foo : Foo
>x : number
class Baz { z: number }
>Baz : Baz
>z : number
function* g() {
>g : () => IterableIterator<Foo | Baz>
yield new Foo;
>yield new Foo : any
>new Foo : Foo
>Foo : typeof Foo
yield* [new Baz];
>yield* [new Baz] : any
>[new Baz] : Baz[]
>new Baz : Baz
>Baz : typeof Baz
}
@@ -1,12 +0,0 @@
tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck54.ts(3,11): error TS2504: No best common type exists among yield expressions.
==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck54.ts (1 errors) ====
class Foo { x: number }
class Baz { z: number }
function* g() {
~
!!! error TS2504: No best common type exists among yield expressions.
yield* [new Foo];
yield* [new Baz];
}
@@ -0,0 +1,18 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck54.ts ===
class Foo { x: number }
>Foo : Symbol(Foo, Decl(generatorTypeCheck54.ts, 0, 0))
>x : Symbol(Foo.x, Decl(generatorTypeCheck54.ts, 0, 11))
class Baz { z: number }
>Baz : Symbol(Baz, Decl(generatorTypeCheck54.ts, 0, 23))
>z : Symbol(Baz.z, Decl(generatorTypeCheck54.ts, 1, 11))
function* g() {
>g : Symbol(g, Decl(generatorTypeCheck54.ts, 1, 23))
yield* [new Foo];
>Foo : Symbol(Foo, Decl(generatorTypeCheck54.ts, 0, 0))
yield* [new Baz];
>Baz : Symbol(Baz, Decl(generatorTypeCheck54.ts, 0, 23))
}
@@ -0,0 +1,24 @@
=== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck54.ts ===
class Foo { x: number }
>Foo : Foo
>x : number
class Baz { z: number }
>Baz : Baz
>z : number
function* g() {
>g : () => IterableIterator<Foo | Baz>
yield* [new Foo];
>yield* [new Foo] : any
>[new Foo] : Foo[]
>new Foo : Foo
>Foo : typeof Foo
yield* [new Baz];
>yield* [new Baz] : any
>[new Baz] : Baz[]
>new Baz : Baz
>Baz : typeof Baz
}
@@ -1,16 +0,0 @@
tests/cases/compiler/inferredFunctionReturnTypeIsEmptyType.ts(2,10): error TS2354: No best common type exists among return expressions.
==== tests/cases/compiler/inferredFunctionReturnTypeIsEmptyType.ts (1 errors) ====
function foo() {
~~~
!!! error TS2354: No best common type exists among return expressions.
if (true) {
return 42;
}
else {
return "42";
}
};
@@ -0,0 +1,13 @@
=== tests/cases/compiler/inferredFunctionReturnTypeIsEmptyType.ts ===
function foo() {
>foo : Symbol(foo, Decl(inferredFunctionReturnTypeIsEmptyType.ts, 0, 0))
if (true) {
return 42;
}
else {
return "42";
}
};
@@ -0,0 +1,17 @@
=== tests/cases/compiler/inferredFunctionReturnTypeIsEmptyType.ts ===
function foo() {
>foo : () => string | number
if (true) {
>true : boolean
return 42;
>42 : number
}
else {
return "42";
>"42" : string
}
};
@@ -1,57 +0,0 @@
tests/cases/conformance/types/stringLiteral/stringLiteralTypesOverloads02.ts(9,10): error TS2354: No best common type exists among return expressions.
==== tests/cases/conformance/types/stringLiteral/stringLiteralTypesOverloads02.ts (1 errors) ====
function getFalsyPrimitive(x: "string"): string;
function getFalsyPrimitive(x: "number"): number;
function getFalsyPrimitive(x: "boolean"): boolean;
function getFalsyPrimitive(x: "boolean" | "string"): boolean | string;
function getFalsyPrimitive(x: "boolean" | "number"): boolean | number;
function getFalsyPrimitive(x: "number" | "string"): number | string;
function getFalsyPrimitive(x: "number" | "string" | "boolean"): number | string | boolean;
function getFalsyPrimitive(x: string) {
~~~~~~~~~~~~~~~~~
!!! error TS2354: No best common type exists among return expressions.
if (x === "string") {
return "";
}
if (x === "number") {
return 0;
}
if (x === "boolean") {
return false;
}
// Should be unreachable.
throw "Invalid value";
}
namespace Consts1 {
const EMPTY_STRING = getFalsyPrimitive("string");
const ZERO = getFalsyPrimitive('number');
const FALSE = getFalsyPrimitive("boolean");
}
const string: "string" = "string"
const number: "number" = "number"
const boolean: "boolean" = "boolean"
const stringOrNumber = string || number;
const stringOrBoolean = string || boolean;
const booleanOrNumber = number || boolean;
const stringOrBooleanOrNumber = stringOrBoolean || number;
namespace Consts2 {
const EMPTY_STRING = getFalsyPrimitive(string);
const ZERO = getFalsyPrimitive(number);
const FALSE = getFalsyPrimitive(boolean);
const a = getFalsyPrimitive(stringOrNumber);
const b = getFalsyPrimitive(stringOrBoolean);
const c = getFalsyPrimitive(booleanOrNumber);
const d = getFalsyPrimitive(stringOrBooleanOrNumber);
}
@@ -0,0 +1,140 @@
=== tests/cases/conformance/types/stringLiteral/stringLiteralTypesOverloads02.ts ===
function getFalsyPrimitive(x: "string"): string;
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 1, 27))
function getFalsyPrimitive(x: "number"): number;
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 2, 27))
function getFalsyPrimitive(x: "boolean"): boolean;
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 3, 27))
function getFalsyPrimitive(x: "boolean" | "string"): boolean | string;
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 4, 27))
function getFalsyPrimitive(x: "boolean" | "number"): boolean | number;
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 5, 27))
function getFalsyPrimitive(x: "number" | "string"): number | string;
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 6, 27))
function getFalsyPrimitive(x: "number" | "string" | "boolean"): number | string | boolean;
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 7, 27))
function getFalsyPrimitive(x: string) {
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 8, 27))
if (x === "string") {
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 8, 27))
return "";
}
if (x === "number") {
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 8, 27))
return 0;
}
if (x === "boolean") {
>x : Symbol(x, Decl(stringLiteralTypesOverloads02.ts, 8, 27))
return false;
}
// Should be unreachable.
throw "Invalid value";
}
namespace Consts1 {
>Consts1 : Symbol(Consts1, Decl(stringLiteralTypesOverloads02.ts, 21, 1))
const EMPTY_STRING = getFalsyPrimitive("string");
>EMPTY_STRING : Symbol(EMPTY_STRING, Decl(stringLiteralTypesOverloads02.ts, 24, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
const ZERO = getFalsyPrimitive('number');
>ZERO : Symbol(ZERO, Decl(stringLiteralTypesOverloads02.ts, 25, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
const FALSE = getFalsyPrimitive("boolean");
>FALSE : Symbol(FALSE, Decl(stringLiteralTypesOverloads02.ts, 26, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
}
const string: "string" = "string"
>string : Symbol(string, Decl(stringLiteralTypesOverloads02.ts, 29, 5))
const number: "number" = "number"
>number : Symbol(number, Decl(stringLiteralTypesOverloads02.ts, 30, 5))
const boolean: "boolean" = "boolean"
>boolean : Symbol(boolean, Decl(stringLiteralTypesOverloads02.ts, 31, 5))
const stringOrNumber = string || number;
>stringOrNumber : Symbol(stringOrNumber, Decl(stringLiteralTypesOverloads02.ts, 33, 5))
>string : Symbol(string, Decl(stringLiteralTypesOverloads02.ts, 29, 5))
>number : Symbol(number, Decl(stringLiteralTypesOverloads02.ts, 30, 5))
const stringOrBoolean = string || boolean;
>stringOrBoolean : Symbol(stringOrBoolean, Decl(stringLiteralTypesOverloads02.ts, 34, 5))
>string : Symbol(string, Decl(stringLiteralTypesOverloads02.ts, 29, 5))
>boolean : Symbol(boolean, Decl(stringLiteralTypesOverloads02.ts, 31, 5))
const booleanOrNumber = number || boolean;
>booleanOrNumber : Symbol(booleanOrNumber, Decl(stringLiteralTypesOverloads02.ts, 35, 5))
>number : Symbol(number, Decl(stringLiteralTypesOverloads02.ts, 30, 5))
>boolean : Symbol(boolean, Decl(stringLiteralTypesOverloads02.ts, 31, 5))
const stringOrBooleanOrNumber = stringOrBoolean || number;
>stringOrBooleanOrNumber : Symbol(stringOrBooleanOrNumber, Decl(stringLiteralTypesOverloads02.ts, 36, 5))
>stringOrBoolean : Symbol(stringOrBoolean, Decl(stringLiteralTypesOverloads02.ts, 34, 5))
>number : Symbol(number, Decl(stringLiteralTypesOverloads02.ts, 30, 5))
namespace Consts2 {
>Consts2 : Symbol(Consts2, Decl(stringLiteralTypesOverloads02.ts, 36, 58))
const EMPTY_STRING = getFalsyPrimitive(string);
>EMPTY_STRING : Symbol(EMPTY_STRING, Decl(stringLiteralTypesOverloads02.ts, 39, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>string : Symbol(string, Decl(stringLiteralTypesOverloads02.ts, 29, 5))
const ZERO = getFalsyPrimitive(number);
>ZERO : Symbol(ZERO, Decl(stringLiteralTypesOverloads02.ts, 40, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>number : Symbol(number, Decl(stringLiteralTypesOverloads02.ts, 30, 5))
const FALSE = getFalsyPrimitive(boolean);
>FALSE : Symbol(FALSE, Decl(stringLiteralTypesOverloads02.ts, 41, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>boolean : Symbol(boolean, Decl(stringLiteralTypesOverloads02.ts, 31, 5))
const a = getFalsyPrimitive(stringOrNumber);
>a : Symbol(a, Decl(stringLiteralTypesOverloads02.ts, 43, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>stringOrNumber : Symbol(stringOrNumber, Decl(stringLiteralTypesOverloads02.ts, 33, 5))
const b = getFalsyPrimitive(stringOrBoolean);
>b : Symbol(b, Decl(stringLiteralTypesOverloads02.ts, 44, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>stringOrBoolean : Symbol(stringOrBoolean, Decl(stringLiteralTypesOverloads02.ts, 34, 5))
const c = getFalsyPrimitive(booleanOrNumber);
>c : Symbol(c, Decl(stringLiteralTypesOverloads02.ts, 45, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>booleanOrNumber : Symbol(booleanOrNumber, Decl(stringLiteralTypesOverloads02.ts, 35, 5))
const d = getFalsyPrimitive(stringOrBooleanOrNumber);
>d : Symbol(d, Decl(stringLiteralTypesOverloads02.ts, 46, 9))
>getFalsyPrimitive : Symbol(getFalsyPrimitive, Decl(stringLiteralTypesOverloads02.ts, 0, 0), Decl(stringLiteralTypesOverloads02.ts, 1, 48), Decl(stringLiteralTypesOverloads02.ts, 2, 48), Decl(stringLiteralTypesOverloads02.ts, 3, 50), Decl(stringLiteralTypesOverloads02.ts, 4, 70), Decl(stringLiteralTypesOverloads02.ts, 5, 70), Decl(stringLiteralTypesOverloads02.ts, 6, 68), Decl(stringLiteralTypesOverloads02.ts, 7, 90))
>stringOrBooleanOrNumber : Symbol(stringOrBooleanOrNumber, Decl(stringLiteralTypesOverloads02.ts, 36, 5))
}
@@ -0,0 +1,170 @@
=== tests/cases/conformance/types/stringLiteral/stringLiteralTypesOverloads02.ts ===
function getFalsyPrimitive(x: "string"): string;
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : "string"
function getFalsyPrimitive(x: "number"): number;
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : "number"
function getFalsyPrimitive(x: "boolean"): boolean;
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : "boolean"
function getFalsyPrimitive(x: "boolean" | "string"): boolean | string;
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : "string" | "boolean"
function getFalsyPrimitive(x: "boolean" | "number"): boolean | number;
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : "number" | "boolean"
function getFalsyPrimitive(x: "number" | "string"): number | string;
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : "string" | "number"
function getFalsyPrimitive(x: "number" | "string" | "boolean"): number | string | boolean;
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : "string" | "number" | "boolean"
function getFalsyPrimitive(x: string) {
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>x : string
if (x === "string") {
>x === "string" : boolean
>x : string
>"string" : "string"
return "";
>"" : string
}
if (x === "number") {
>x === "number" : boolean
>x : string
>"number" : "number"
return 0;
>0 : number
}
if (x === "boolean") {
>x === "boolean" : boolean
>x : string
>"boolean" : "boolean"
return false;
>false : boolean
}
// Should be unreachable.
throw "Invalid value";
>"Invalid value" : string
}
namespace Consts1 {
>Consts1 : typeof Consts1
const EMPTY_STRING = getFalsyPrimitive("string");
>EMPTY_STRING : string
>getFalsyPrimitive("string") : string
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>"string" : "string"
const ZERO = getFalsyPrimitive('number');
>ZERO : number
>getFalsyPrimitive('number') : number
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>'number' : "number"
const FALSE = getFalsyPrimitive("boolean");
>FALSE : boolean
>getFalsyPrimitive("boolean") : boolean
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>"boolean" : "boolean"
}
const string: "string" = "string"
>string : "string"
>"string" : "string"
const number: "number" = "number"
>number : "number"
>"number" : "number"
const boolean: "boolean" = "boolean"
>boolean : "boolean"
>"boolean" : "boolean"
const stringOrNumber = string || number;
>stringOrNumber : "string" | "number"
>string || number : "string" | "number"
>string : "string"
>number : "number"
const stringOrBoolean = string || boolean;
>stringOrBoolean : "string" | "boolean"
>string || boolean : "string" | "boolean"
>string : "string"
>boolean : "boolean"
const booleanOrNumber = number || boolean;
>booleanOrNumber : "number" | "boolean"
>number || boolean : "number" | "boolean"
>number : "number"
>boolean : "boolean"
const stringOrBooleanOrNumber = stringOrBoolean || number;
>stringOrBooleanOrNumber : "string" | "number" | "boolean"
>stringOrBoolean || number : "string" | "number" | "boolean"
>stringOrBoolean : "string" | "boolean"
>number : "number"
namespace Consts2 {
>Consts2 : typeof Consts2
const EMPTY_STRING = getFalsyPrimitive(string);
>EMPTY_STRING : string
>getFalsyPrimitive(string) : string
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>string : "string"
const ZERO = getFalsyPrimitive(number);
>ZERO : number
>getFalsyPrimitive(number) : number
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>number : "number"
const FALSE = getFalsyPrimitive(boolean);
>FALSE : boolean
>getFalsyPrimitive(boolean) : boolean
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>boolean : "boolean"
const a = getFalsyPrimitive(stringOrNumber);
>a : string | number
>getFalsyPrimitive(stringOrNumber) : string | number
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>stringOrNumber : "string" | "number"
const b = getFalsyPrimitive(stringOrBoolean);
>b : string | boolean
>getFalsyPrimitive(stringOrBoolean) : string | boolean
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>stringOrBoolean : "string" | "boolean"
const c = getFalsyPrimitive(booleanOrNumber);
>c : number | boolean
>getFalsyPrimitive(booleanOrNumber) : number | boolean
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>booleanOrNumber : "number" | "boolean"
const d = getFalsyPrimitive(stringOrBooleanOrNumber);
>d : string | number | boolean
>getFalsyPrimitive(stringOrBooleanOrNumber) : string | number | boolean
>getFalsyPrimitive : { (x: "string"): string; (x: "number"): number; (x: "boolean"): boolean; (x: "string" | "boolean"): string | boolean; (x: "number" | "boolean"): number | boolean; (x: "string" | "number"): string | number; (x: "string" | "number" | "boolean"): string | number | boolean; }
>stringOrBooleanOrNumber : "string" | "number" | "boolean"
}
@@ -1,10 +1,7 @@
tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts(22,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts(31,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts(49,10): error TS2354: No best common type exists among return expressions.
tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts(139,17): error TS2339: Property 'toString' does not exist on type 'never'.
==== tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts (4 errors) ====
==== tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts (1 errors) ====
// In the true branch statement of an 'if' statement,
// the type of a variable or parameter is narrowed by any type guard in the 'if' condition when true.
// In the false branch statement of an 'if' statement,
@@ -27,8 +24,6 @@ tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts(139,17
}
}
function foo3(x: number | string) {
~~~~
!!! error TS2354: No best common type exists among return expressions.
if (typeof x === "string") {
x = "Hello";
return x; // string
@@ -38,8 +33,6 @@ tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts(139,17
}
}
function foo4(x: number | string) {
~~~~
!!! error TS2354: No best common type exists among return expressions.
if (typeof x === "string") {
return x; // string
}
@@ -58,8 +51,6 @@ tests/cases/conformance/expressions/typeGuards/typeGuardsInIfStatement.ts(139,17
}
}
function foo6(x: number | string) {
~~~~
!!! error TS2354: No best common type exists among return expressions.
if (typeof x === "string") {
x = 10;
return x; // number