TypeScript/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.types
2015-04-13 14:29:37 -07:00

311 lines
16 KiB
Plaintext

=== tests/cases/conformance/expressions/typeGuards/typeGuardsInFunctionAndModuleBlock.ts ===
// typeguards are scoped in function/module block
function foo(x: number | string | boolean) {
>foo : (x: string | number | boolean) => string, Symbol(foo, Decl(typeGuardsInFunctionAndModuleBlock.ts, 0, 0))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 2, 13))
return typeof x === "string"
>typeof x === "string" ? x : function f() { var b = x; // number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } () : string
>typeof x === "string" : boolean
>typeof x : string
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 2, 13))
>"string" : string
? x
>x : string, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 2, 13))
: function f() {
>function f() { var b = x; // number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } () : string
>function f() { var b = x; // number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } : () => string
>f : () => string, Symbol(f, Decl(typeGuardsInFunctionAndModuleBlock.ts, 5, 9))
var b = x; // number | boolean
>b : number | boolean, Symbol(b, Decl(typeGuardsInFunctionAndModuleBlock.ts, 6, 15))
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 2, 13))
return typeof x === "boolean"
>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>typeof x === "boolean" : boolean
>typeof x : string
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 2, 13))
>"boolean" : string
? x.toString() // boolean
>x.toString() : string
>x.toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
>x : boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 2, 13))
>toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
: x.toString(); // number
>x.toString() : string
>x.toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
>x : number, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 2, 13))
>toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
} ();
}
function foo2(x: number | string | boolean) {
>foo2 : (x: string | number | boolean) => string, Symbol(foo2, Decl(typeGuardsInFunctionAndModuleBlock.ts, 11, 1))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
return typeof x === "string"
>typeof x === "string" ? x : function f(a: number | boolean) { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } (x) : string
>typeof x === "string" : boolean
>typeof x : string
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
>"string" : string
? x
>x : string, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
: function f(a: number | boolean) {
>function f(a: number | boolean) { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } (x) : string
>function f(a: number | boolean) { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } : (a: number | boolean) => string
>f : (a: number | boolean) => string, Symbol(f, Decl(typeGuardsInFunctionAndModuleBlock.ts, 15, 9))
>a : number | boolean, Symbol(a, Decl(typeGuardsInFunctionAndModuleBlock.ts, 15, 21))
var b = x; // new scope - number | boolean
>b : number | boolean, Symbol(b, Decl(typeGuardsInFunctionAndModuleBlock.ts, 16, 15))
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
return typeof x === "boolean"
>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>typeof x === "boolean" : boolean
>typeof x : string
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
>"boolean" : string
? x.toString() // boolean
>x.toString() : string
>x.toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
>x : boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
>toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
: x.toString(); // number
>x.toString() : string
>x.toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
>x : number, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
>toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
} (x); // x here is narrowed to number | boolean
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 12, 14))
}
function foo3(x: number | string | boolean) {
>foo3 : (x: string | number | boolean) => string, Symbol(foo3, Decl(typeGuardsInFunctionAndModuleBlock.ts, 21, 1))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 22, 14))
return typeof x === "string"
>typeof x === "string" ? x : (() => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number })() : string
>typeof x === "string" : boolean
>typeof x : string
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 22, 14))
>"string" : string
? x
>x : string, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 22, 14))
: (() => {
>(() => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number })() : string
>(() => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number }) : () => string
>() => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } : () => string
var b = x; // new scope - number | boolean
>b : number | boolean, Symbol(b, Decl(typeGuardsInFunctionAndModuleBlock.ts, 26, 15))
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 22, 14))
return typeof x === "boolean"
>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>typeof x === "boolean" : boolean
>typeof x : string
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 22, 14))
>"boolean" : string
? x.toString() // boolean
>x.toString() : string
>x.toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
>x : boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 22, 14))
>toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
: x.toString(); // number
>x.toString() : string
>x.toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
>x : number, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 22, 14))
>toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
})();
}
function foo4(x: number | string | boolean) {
>foo4 : (x: string | number | boolean) => string, Symbol(foo4, Decl(typeGuardsInFunctionAndModuleBlock.ts, 31, 1))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
return typeof x === "string"
>typeof x === "string" ? x : ((a: number | boolean) => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number })(x) : string
>typeof x === "string" : boolean
>typeof x : string
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
>"string" : string
? x
>x : string, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
: ((a: number | boolean) => {
>((a: number | boolean) => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number })(x) : string
>((a: number | boolean) => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number }) : (a: number | boolean) => string
>(a: number | boolean) => { var b = x; // new scope - number | boolean return typeof x === "boolean" ? x.toString() // boolean : x.toString(); // number } : (a: number | boolean) => string
>a : number | boolean, Symbol(a, Decl(typeGuardsInFunctionAndModuleBlock.ts, 35, 12))
var b = x; // new scope - number | boolean
>b : number | boolean, Symbol(b, Decl(typeGuardsInFunctionAndModuleBlock.ts, 36, 15))
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
return typeof x === "boolean"
>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>typeof x === "boolean" : boolean
>typeof x : string
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
>"boolean" : string
? x.toString() // boolean
>x.toString() : string
>x.toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
>x : boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
>toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
: x.toString(); // number
>x.toString() : string
>x.toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
>x : number, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
>toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
})(x); // x here is narrowed to number | boolean
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 32, 14))
}
// Type guards affect nested function expressions, but not nested function declarations
function foo5(x: number | string | boolean) {
>foo5 : (x: string | number | boolean) => void, Symbol(foo5, Decl(typeGuardsInFunctionAndModuleBlock.ts, 41, 1))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 43, 14))
if (typeof x === "string") {
>typeof x === "string" : boolean
>typeof x : string
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 43, 14))
>"string" : string
var y = x; // string;
>y : string, Symbol(y, Decl(typeGuardsInFunctionAndModuleBlock.ts, 45, 11))
>x : string, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 43, 14))
function foo() {
>foo : () => void, Symbol(foo, Decl(typeGuardsInFunctionAndModuleBlock.ts, 45, 18))
var z = x; // number | string | boolean, type guard has no effect
>z : string | number | boolean, Symbol(z, Decl(typeGuardsInFunctionAndModuleBlock.ts, 47, 15))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 43, 14))
}
}
}
module m {
>m : typeof m, Symbol(m, Decl(typeGuardsInFunctionAndModuleBlock.ts, 50, 1))
var x: number | string | boolean;
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 7))
module m2 {
>m2 : typeof m2, Symbol(m2, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 37))
var b = x; // new scope - number | boolean | string
>b : string | number | boolean, Symbol(b, Decl(typeGuardsInFunctionAndModuleBlock.ts, 54, 11))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 7))
var y: string;
>y : string, Symbol(y, Decl(typeGuardsInFunctionAndModuleBlock.ts, 55, 11))
if (typeof x === "string") {
>typeof x === "string" : boolean
>typeof x : string
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 7))
>"string" : string
y = x // string;
>y = x : string
>y : string, Symbol(y, Decl(typeGuardsInFunctionAndModuleBlock.ts, 55, 11))
>x : string, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 7))
} else {
y = typeof x === "boolean"
>y = typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>y : string, Symbol(y, Decl(typeGuardsInFunctionAndModuleBlock.ts, 55, 11))
>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>typeof x === "boolean" : boolean
>typeof x : string
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 7))
>"boolean" : string
? x.toString() // boolean
>x.toString() : string
>x.toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
>x : boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 7))
>toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
: x.toString(); // number
>x.toString() : string
>x.toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
>x : number, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 52, 7))
>toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
}
}
}
module m1 {
>m1 : typeof m1, Symbol(m1, Decl(typeGuardsInFunctionAndModuleBlock.ts, 64, 1))
var x: number | string | boolean;
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 7))
module m2.m3 {
>m2 : typeof m2, Symbol(m2, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 37))
>m3 : typeof m3, Symbol(m3, Decl(typeGuardsInFunctionAndModuleBlock.ts, 67, 14))
var b = x; // new scope - number | boolean | string
>b : string | number | boolean, Symbol(b, Decl(typeGuardsInFunctionAndModuleBlock.ts, 68, 11))
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 7))
var y: string;
>y : string, Symbol(y, Decl(typeGuardsInFunctionAndModuleBlock.ts, 69, 11))
if (typeof x === "string") {
>typeof x === "string" : boolean
>typeof x : string
>x : string | number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 7))
>"string" : string
y = x // string;
>y = x : string
>y : string, Symbol(y, Decl(typeGuardsInFunctionAndModuleBlock.ts, 69, 11))
>x : string, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 7))
} else {
y = typeof x === "boolean"
>y = typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>y : string, Symbol(y, Decl(typeGuardsInFunctionAndModuleBlock.ts, 69, 11))
>typeof x === "boolean" ? x.toString() // boolean : x.toString() : string
>typeof x === "boolean" : boolean
>typeof x : string
>x : number | boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 7))
>"boolean" : string
? x.toString() // boolean
>x.toString() : string
>x.toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
>x : boolean, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 7))
>toString : () => string, Symbol(Object.toString, Decl(lib.d.ts, 96, 26))
: x.toString(); // number
>x.toString() : string
>x.toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
>x : number, Symbol(x, Decl(typeGuardsInFunctionAndModuleBlock.ts, 66, 7))
>toString : (radix?: number) => string, Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
}
}
}