diff --git a/tests/baselines/reference/literalTypeWidening.js b/tests/baselines/reference/literalTypeWidening.js new file mode 100644 index 00000000000..58002123557 --- /dev/null +++ b/tests/baselines/reference/literalTypeWidening.js @@ -0,0 +1,174 @@ +//// [literalTypeWidening.ts] +// Widening vs. non-widening literal types + +function f1() { + const c1 = "hello"; // Widening type "hello" + let v1 = c1; // Type string + const c2 = c1; // Widening type "hello" + let v2 = c2; // Type string + const c3: "hello" = "hello"; // Type "hello" + let v3 = c3; // Type "hello" + const c4: "hello" = c1; // Type "hello" + let v4 = c4; // Type "hello" +} + +function f2(cond: boolean) { + const c1 = cond ? "foo" : "bar"; // widening "foo" | widening "bar" + const c2: "foo" | "bar" = c1; // "foo" | "bar" + const c3 = cond ? c1 : c2; // "foo" | "bar" + const c4 = cond ? c3 : "baz"; // "foo" | "bar" | widening "baz" + const c5: "foo" | "bar" | "baz" = c4; // "foo" | "bar" | "baz" + let v1 = c1; // string + let v2 = c2; // "foo" | "bar" + let v3 = c3; // "foo" | "bar" + let v4 = c4; // string + let v5 = c5; // "foo" | "bar" | "baz" +} + +function f3() { + const c1 = 123; // Widening type 123 + let v1 = c1; // Type number + const c2 = c1; // Widening type 123 + let v2 = c2; // Type number + const c3: 123 = 123; // Type 123 + let v3 = c3; // Type 123 + const c4: 123 = c1; // Type 123 + let v4 = c4; // Type 123 +} + +function f4(cond: boolean) { + const c1 = cond ? 123 : 456; // widening 123 | widening 456 + const c2: 123 | 456 = c1; // 123 | 456 + const c3 = cond ? c1 : c2; // 123 | 456 + const c4 = cond ? c3 : 789; // 123 | 456 | widening 789 + const c5: 123 | 456 | 789 = c4; // 123 | 456 | 789 + let v1 = c1; // number + let v2 = c2; // 123 | 456 + let v3 = c3; // 123 | 456 + let v4 = c4; // number + let v5 = c5; // 123 | 456 | 789 +} + +function f5() { + const c1 = "foo"; + let v1 = c1; + const c2: "foo" = "foo"; + let v2 = c2; + const c3 = "foo" as "foo"; + let v3 = c3; + const c4 = <"foo">"foo"; + let v4 = c4; +} + +// Repro from #10898 + +type FAILURE = "FAILURE"; +const FAILURE = "FAILURE"; + +type Result = T | FAILURE; + +function doWork(): Result { + return FAILURE; +} + +function isSuccess(result: Result): result is T { + return !isFailure(result); +} + +function isFailure(result: Result): result is FAILURE { + return result === FAILURE; +} + +function increment(x: number): number { + return x + 1; +} + +let result = doWork(); + +if (isSuccess(result)) { + increment(result); +} + +// Repro from #10898 + +type TestEvent = "onmouseover" | "onmouseout"; + +function onMouseOver(): TestEvent { return "onmouseover"; } + +let x = onMouseOver(); + +//// [literalTypeWidening.js] +// Widening vs. non-widening literal types +function f1() { + var c1 = "hello"; // Widening type "hello" + var v1 = c1; // Type string + var c2 = c1; // Widening type "hello" + var v2 = c2; // Type string + var c3 = "hello"; // Type "hello" + var v3 = c3; // Type "hello" + var c4 = c1; // Type "hello" + var v4 = c4; // Type "hello" +} +function f2(cond) { + var c1 = cond ? "foo" : "bar"; // widening "foo" | widening "bar" + var c2 = c1; // "foo" | "bar" + var c3 = cond ? c1 : c2; // "foo" | "bar" + var c4 = cond ? c3 : "baz"; // "foo" | "bar" | widening "baz" + var c5 = c4; // "foo" | "bar" | "baz" + var v1 = c1; // string + var v2 = c2; // "foo" | "bar" + var v3 = c3; // "foo" | "bar" + var v4 = c4; // string + var v5 = c5; // "foo" | "bar" | "baz" +} +function f3() { + var c1 = 123; // Widening type 123 + var v1 = c1; // Type number + var c2 = c1; // Widening type 123 + var v2 = c2; // Type number + var c3 = 123; // Type 123 + var v3 = c3; // Type 123 + var c4 = c1; // Type 123 + var v4 = c4; // Type 123 +} +function f4(cond) { + var c1 = cond ? 123 : 456; // widening 123 | widening 456 + var c2 = c1; // 123 | 456 + var c3 = cond ? c1 : c2; // 123 | 456 + var c4 = cond ? c3 : 789; // 123 | 456 | widening 789 + var c5 = c4; // 123 | 456 | 789 + var v1 = c1; // number + var v2 = c2; // 123 | 456 + var v3 = c3; // 123 | 456 + var v4 = c4; // number + var v5 = c5; // 123 | 456 | 789 +} +function f5() { + var c1 = "foo"; + var v1 = c1; + var c2 = "foo"; + var v2 = c2; + var c3 = "foo"; + var v3 = c3; + var c4 = "foo"; + var v4 = c4; +} +var FAILURE = "FAILURE"; +function doWork() { + return FAILURE; +} +function isSuccess(result) { + return !isFailure(result); +} +function isFailure(result) { + return result === FAILURE; +} +function increment(x) { + return x + 1; +} +var result = doWork(); +if (isSuccess(result)) { + increment(result); +} +function onMouseOver() { return "onmouseover"; } +var x = onMouseOver(); diff --git a/tests/baselines/reference/literalTypeWidening.symbols b/tests/baselines/reference/literalTypeWidening.symbols new file mode 100644 index 00000000000..e0da630180e --- /dev/null +++ b/tests/baselines/reference/literalTypeWidening.symbols @@ -0,0 +1,285 @@ +=== tests/cases/conformance/types/literal/literalTypeWidening.ts === +// Widening vs. non-widening literal types + +function f1() { +>f1 : Symbol(f1, Decl(literalTypeWidening.ts, 0, 0)) + + const c1 = "hello"; // Widening type "hello" +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 3, 9)) + + let v1 = c1; // Type string +>v1 : Symbol(v1, Decl(literalTypeWidening.ts, 4, 7)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 3, 9)) + + const c2 = c1; // Widening type "hello" +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 5, 9)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 3, 9)) + + let v2 = c2; // Type string +>v2 : Symbol(v2, Decl(literalTypeWidening.ts, 6, 7)) +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 5, 9)) + + const c3: "hello" = "hello"; // Type "hello" +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 7, 9)) + + let v3 = c3; // Type "hello" +>v3 : Symbol(v3, Decl(literalTypeWidening.ts, 8, 7)) +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 7, 9)) + + const c4: "hello" = c1; // Type "hello" +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 9, 9)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 3, 9)) + + let v4 = c4; // Type "hello" +>v4 : Symbol(v4, Decl(literalTypeWidening.ts, 10, 7)) +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 9, 9)) +} + +function f2(cond: boolean) { +>f2 : Symbol(f2, Decl(literalTypeWidening.ts, 11, 1)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 13, 12)) + + const c1 = cond ? "foo" : "bar"; // widening "foo" | widening "bar" +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 14, 9)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 13, 12)) + + const c2: "foo" | "bar" = c1; // "foo" | "bar" +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 15, 9)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 14, 9)) + + const c3 = cond ? c1 : c2; // "foo" | "bar" +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 16, 9)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 13, 12)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 14, 9)) +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 15, 9)) + + const c4 = cond ? c3 : "baz"; // "foo" | "bar" | widening "baz" +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 17, 9)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 13, 12)) +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 16, 9)) + + const c5: "foo" | "bar" | "baz" = c4; // "foo" | "bar" | "baz" +>c5 : Symbol(c5, Decl(literalTypeWidening.ts, 18, 9)) +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 17, 9)) + + let v1 = c1; // string +>v1 : Symbol(v1, Decl(literalTypeWidening.ts, 19, 7)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 14, 9)) + + let v2 = c2; // "foo" | "bar" +>v2 : Symbol(v2, Decl(literalTypeWidening.ts, 20, 7)) +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 15, 9)) + + let v3 = c3; // "foo" | "bar" +>v3 : Symbol(v3, Decl(literalTypeWidening.ts, 21, 7)) +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 16, 9)) + + let v4 = c4; // string +>v4 : Symbol(v4, Decl(literalTypeWidening.ts, 22, 7)) +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 17, 9)) + + let v5 = c5; // "foo" | "bar" | "baz" +>v5 : Symbol(v5, Decl(literalTypeWidening.ts, 23, 7)) +>c5 : Symbol(c5, Decl(literalTypeWidening.ts, 18, 9)) +} + +function f3() { +>f3 : Symbol(f3, Decl(literalTypeWidening.ts, 24, 1)) + + const c1 = 123; // Widening type 123 +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 27, 9)) + + let v1 = c1; // Type number +>v1 : Symbol(v1, Decl(literalTypeWidening.ts, 28, 7)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 27, 9)) + + const c2 = c1; // Widening type 123 +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 29, 9)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 27, 9)) + + let v2 = c2; // Type number +>v2 : Symbol(v2, Decl(literalTypeWidening.ts, 30, 7)) +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 29, 9)) + + const c3: 123 = 123; // Type 123 +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 31, 9)) + + let v3 = c3; // Type 123 +>v3 : Symbol(v3, Decl(literalTypeWidening.ts, 32, 7)) +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 31, 9)) + + const c4: 123 = c1; // Type 123 +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 33, 9)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 27, 9)) + + let v4 = c4; // Type 123 +>v4 : Symbol(v4, Decl(literalTypeWidening.ts, 34, 7)) +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 33, 9)) +} + +function f4(cond: boolean) { +>f4 : Symbol(f4, Decl(literalTypeWidening.ts, 35, 1)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 37, 12)) + + const c1 = cond ? 123 : 456; // widening 123 | widening 456 +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 38, 9)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 37, 12)) + + const c2: 123 | 456 = c1; // 123 | 456 +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 39, 9)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 38, 9)) + + const c3 = cond ? c1 : c2; // 123 | 456 +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 40, 9)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 37, 12)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 38, 9)) +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 39, 9)) + + const c4 = cond ? c3 : 789; // 123 | 456 | widening 789 +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 41, 9)) +>cond : Symbol(cond, Decl(literalTypeWidening.ts, 37, 12)) +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 40, 9)) + + const c5: 123 | 456 | 789 = c4; // 123 | 456 | 789 +>c5 : Symbol(c5, Decl(literalTypeWidening.ts, 42, 9)) +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 41, 9)) + + let v1 = c1; // number +>v1 : Symbol(v1, Decl(literalTypeWidening.ts, 43, 7)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 38, 9)) + + let v2 = c2; // 123 | 456 +>v2 : Symbol(v2, Decl(literalTypeWidening.ts, 44, 7)) +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 39, 9)) + + let v3 = c3; // 123 | 456 +>v3 : Symbol(v3, Decl(literalTypeWidening.ts, 45, 7)) +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 40, 9)) + + let v4 = c4; // number +>v4 : Symbol(v4, Decl(literalTypeWidening.ts, 46, 7)) +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 41, 9)) + + let v5 = c5; // 123 | 456 | 789 +>v5 : Symbol(v5, Decl(literalTypeWidening.ts, 47, 7)) +>c5 : Symbol(c5, Decl(literalTypeWidening.ts, 42, 9)) +} + +function f5() { +>f5 : Symbol(f5, Decl(literalTypeWidening.ts, 48, 1)) + + const c1 = "foo"; +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 51, 9)) + + let v1 = c1; +>v1 : Symbol(v1, Decl(literalTypeWidening.ts, 52, 7)) +>c1 : Symbol(c1, Decl(literalTypeWidening.ts, 51, 9)) + + const c2: "foo" = "foo"; +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 53, 9)) + + let v2 = c2; +>v2 : Symbol(v2, Decl(literalTypeWidening.ts, 54, 7)) +>c2 : Symbol(c2, Decl(literalTypeWidening.ts, 53, 9)) + + const c3 = "foo" as "foo"; +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 55, 9)) + + let v3 = c3; +>v3 : Symbol(v3, Decl(literalTypeWidening.ts, 56, 7)) +>c3 : Symbol(c3, Decl(literalTypeWidening.ts, 55, 9)) + + const c4 = <"foo">"foo"; +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 57, 9)) + + let v4 = c4; +>v4 : Symbol(v4, Decl(literalTypeWidening.ts, 58, 7)) +>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 57, 9)) +} + +// Repro from #10898 + +type FAILURE = "FAILURE"; +>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5)) + +const FAILURE = "FAILURE"; +>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5)) + +type Result = T | FAILURE; +>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 66, 12)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 66, 12)) +>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5)) + +function doWork(): Result { +>doWork : Symbol(doWork, Decl(literalTypeWidening.ts, 66, 29)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 68, 16)) +>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 68, 16)) + + return FAILURE; +>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5)) +} + +function isSuccess(result: Result): result is T { +>isSuccess : Symbol(isSuccess, Decl(literalTypeWidening.ts, 70, 1)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 72, 19)) +>result : Symbol(result, Decl(literalTypeWidening.ts, 72, 22)) +>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 72, 19)) +>result : Symbol(result, Decl(literalTypeWidening.ts, 72, 22)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 72, 19)) + + return !isFailure(result); +>isFailure : Symbol(isFailure, Decl(literalTypeWidening.ts, 74, 1)) +>result : Symbol(result, Decl(literalTypeWidening.ts, 72, 22)) +} + +function isFailure(result: Result): result is FAILURE { +>isFailure : Symbol(isFailure, Decl(literalTypeWidening.ts, 74, 1)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 76, 19)) +>result : Symbol(result, Decl(literalTypeWidening.ts, 76, 22)) +>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26)) +>T : Symbol(T, Decl(literalTypeWidening.ts, 76, 19)) +>result : Symbol(result, Decl(literalTypeWidening.ts, 76, 22)) +>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5)) + + return result === FAILURE; +>result : Symbol(result, Decl(literalTypeWidening.ts, 76, 22)) +>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5)) +} + +function increment(x: number): number { +>increment : Symbol(increment, Decl(literalTypeWidening.ts, 78, 1)) +>x : Symbol(x, Decl(literalTypeWidening.ts, 80, 19)) + + return x + 1; +>x : Symbol(x, Decl(literalTypeWidening.ts, 80, 19)) +} + +let result = doWork(); +>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 3)) +>doWork : Symbol(doWork, Decl(literalTypeWidening.ts, 66, 29)) + +if (isSuccess(result)) { +>isSuccess : Symbol(isSuccess, Decl(literalTypeWidening.ts, 70, 1)) +>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 3)) + + increment(result); +>increment : Symbol(increment, Decl(literalTypeWidening.ts, 78, 1)) +>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 3)) +} + +// Repro from #10898 + +type TestEvent = "onmouseover" | "onmouseout"; +>TestEvent : Symbol(TestEvent, Decl(literalTypeWidening.ts, 88, 1)) + +function onMouseOver(): TestEvent { return "onmouseover"; } +>onMouseOver : Symbol(onMouseOver, Decl(literalTypeWidening.ts, 92, 46)) +>TestEvent : Symbol(TestEvent, Decl(literalTypeWidening.ts, 88, 1)) + +let x = onMouseOver(); +>x : Symbol(x, Decl(literalTypeWidening.ts, 96, 3)) +>onMouseOver : Symbol(onMouseOver, Decl(literalTypeWidening.ts, 92, 46)) + diff --git a/tests/baselines/reference/literalTypeWidening.types b/tests/baselines/reference/literalTypeWidening.types new file mode 100644 index 00000000000..db5df6ba90c --- /dev/null +++ b/tests/baselines/reference/literalTypeWidening.types @@ -0,0 +1,318 @@ +=== tests/cases/conformance/types/literal/literalTypeWidening.ts === +// Widening vs. non-widening literal types + +function f1() { +>f1 : () => void + + const c1 = "hello"; // Widening type "hello" +>c1 : "hello" +>"hello" : "hello" + + let v1 = c1; // Type string +>v1 : string +>c1 : "hello" + + const c2 = c1; // Widening type "hello" +>c2 : "hello" +>c1 : "hello" + + let v2 = c2; // Type string +>v2 : string +>c2 : "hello" + + const c3: "hello" = "hello"; // Type "hello" +>c3 : "hello" +>"hello" : "hello" + + let v3 = c3; // Type "hello" +>v3 : "hello" +>c3 : "hello" + + const c4: "hello" = c1; // Type "hello" +>c4 : "hello" +>c1 : "hello" + + let v4 = c4; // Type "hello" +>v4 : "hello" +>c4 : "hello" +} + +function f2(cond: boolean) { +>f2 : (cond: boolean) => void +>cond : boolean + + const c1 = cond ? "foo" : "bar"; // widening "foo" | widening "bar" +>c1 : "foo" | "bar" +>cond ? "foo" : "bar" : "foo" | "bar" +>cond : boolean +>"foo" : "foo" +>"bar" : "bar" + + const c2: "foo" | "bar" = c1; // "foo" | "bar" +>c2 : "foo" | "bar" +>c1 : "foo" | "bar" + + const c3 = cond ? c1 : c2; // "foo" | "bar" +>c3 : "foo" | "bar" +>cond ? c1 : c2 : "foo" | "bar" +>cond : boolean +>c1 : "foo" | "bar" +>c2 : "foo" | "bar" + + const c4 = cond ? c3 : "baz"; // "foo" | "bar" | widening "baz" +>c4 : "foo" | "bar" | "baz" +>cond ? c3 : "baz" : "foo" | "bar" | "baz" +>cond : boolean +>c3 : "foo" | "bar" +>"baz" : "baz" + + const c5: "foo" | "bar" | "baz" = c4; // "foo" | "bar" | "baz" +>c5 : "foo" | "bar" | "baz" +>c4 : "foo" | "bar" | "baz" + + let v1 = c1; // string +>v1 : string +>c1 : "foo" | "bar" + + let v2 = c2; // "foo" | "bar" +>v2 : "foo" | "bar" +>c2 : "foo" | "bar" + + let v3 = c3; // "foo" | "bar" +>v3 : "foo" | "bar" +>c3 : "foo" | "bar" + + let v4 = c4; // string +>v4 : string +>c4 : "foo" | "bar" | "baz" + + let v5 = c5; // "foo" | "bar" | "baz" +>v5 : "foo" | "bar" | "baz" +>c5 : "foo" | "bar" | "baz" +} + +function f3() { +>f3 : () => void + + const c1 = 123; // Widening type 123 +>c1 : 123 +>123 : 123 + + let v1 = c1; // Type number +>v1 : number +>c1 : 123 + + const c2 = c1; // Widening type 123 +>c2 : 123 +>c1 : 123 + + let v2 = c2; // Type number +>v2 : number +>c2 : 123 + + const c3: 123 = 123; // Type 123 +>c3 : 123 +>123 : 123 + + let v3 = c3; // Type 123 +>v3 : 123 +>c3 : 123 + + const c4: 123 = c1; // Type 123 +>c4 : 123 +>c1 : 123 + + let v4 = c4; // Type 123 +>v4 : 123 +>c4 : 123 +} + +function f4(cond: boolean) { +>f4 : (cond: boolean) => void +>cond : boolean + + const c1 = cond ? 123 : 456; // widening 123 | widening 456 +>c1 : 123 | 456 +>cond ? 123 : 456 : 123 | 456 +>cond : boolean +>123 : 123 +>456 : 456 + + const c2: 123 | 456 = c1; // 123 | 456 +>c2 : 123 | 456 +>c1 : 123 | 456 + + const c3 = cond ? c1 : c2; // 123 | 456 +>c3 : 123 | 456 +>cond ? c1 : c2 : 123 | 456 +>cond : boolean +>c1 : 123 | 456 +>c2 : 123 | 456 + + const c4 = cond ? c3 : 789; // 123 | 456 | widening 789 +>c4 : 123 | 456 | 789 +>cond ? c3 : 789 : 123 | 456 | 789 +>cond : boolean +>c3 : 123 | 456 +>789 : 789 + + const c5: 123 | 456 | 789 = c4; // 123 | 456 | 789 +>c5 : 123 | 456 | 789 +>c4 : 123 | 456 | 789 + + let v1 = c1; // number +>v1 : number +>c1 : 123 | 456 + + let v2 = c2; // 123 | 456 +>v2 : 123 | 456 +>c2 : 123 | 456 + + let v3 = c3; // 123 | 456 +>v3 : 123 | 456 +>c3 : 123 | 456 + + let v4 = c4; // number +>v4 : number +>c4 : 123 | 456 | 789 + + let v5 = c5; // 123 | 456 | 789 +>v5 : 123 | 456 | 789 +>c5 : 123 | 456 | 789 +} + +function f5() { +>f5 : () => void + + const c1 = "foo"; +>c1 : "foo" +>"foo" : "foo" + + let v1 = c1; +>v1 : string +>c1 : "foo" + + const c2: "foo" = "foo"; +>c2 : "foo" +>"foo" : "foo" + + let v2 = c2; +>v2 : "foo" +>c2 : "foo" + + const c3 = "foo" as "foo"; +>c3 : "foo" +>"foo" as "foo" : "foo" +>"foo" : "foo" + + let v3 = c3; +>v3 : "foo" +>c3 : "foo" + + const c4 = <"foo">"foo"; +>c4 : "foo" +><"foo">"foo" : "foo" +>"foo" : "foo" + + let v4 = c4; +>v4 : "foo" +>c4 : "foo" +} + +// Repro from #10898 + +type FAILURE = "FAILURE"; +>FAILURE : "FAILURE" + +const FAILURE = "FAILURE"; +>FAILURE : "FAILURE" +>"FAILURE" : "FAILURE" + +type Result = T | FAILURE; +>Result : Result +>T : T +>T : T +>FAILURE : "FAILURE" + +function doWork(): Result { +>doWork : () => Result +>T : T +>Result : Result +>T : T + + return FAILURE; +>FAILURE : "FAILURE" +} + +function isSuccess(result: Result): result is T { +>isSuccess : (result: Result) => result is T +>T : T +>result : Result +>Result : Result +>T : T +>result : any +>T : T + + return !isFailure(result); +>!isFailure(result) : boolean +>isFailure(result) : boolean +>isFailure : (result: Result) => result is "FAILURE" +>result : Result +} + +function isFailure(result: Result): result is FAILURE { +>isFailure : (result: Result) => result is "FAILURE" +>T : T +>result : Result +>Result : Result +>T : T +>result : any +>FAILURE : "FAILURE" + + return result === FAILURE; +>result === FAILURE : boolean +>result : Result +>FAILURE : "FAILURE" +} + +function increment(x: number): number { +>increment : (x: number) => number +>x : number + + return x + 1; +>x + 1 : number +>x : number +>1 : 1 +} + +let result = doWork(); +>result : Result +>doWork() : Result +>doWork : () => Result + +if (isSuccess(result)) { +>isSuccess(result) : boolean +>isSuccess : (result: Result) => result is T +>result : Result + + increment(result); +>increment(result) : number +>increment : (x: number) => number +>result : number +} + +// Repro from #10898 + +type TestEvent = "onmouseover" | "onmouseout"; +>TestEvent : TestEvent + +function onMouseOver(): TestEvent { return "onmouseover"; } +>onMouseOver : () => TestEvent +>TestEvent : TestEvent +>"onmouseover" : "onmouseover" + +let x = onMouseOver(); +>x : TestEvent +>onMouseOver() : TestEvent +>onMouseOver : () => TestEvent +