From 9771f429ed96b3598bcf60e337b5677de77ae6b1 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 24 Sep 2016 15:58:53 -0700 Subject: [PATCH] Add tests --- .../types/literal/literalTypeWidening.ts | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 tests/cases/conformance/types/literal/literalTypeWidening.ts diff --git a/tests/cases/conformance/types/literal/literalTypeWidening.ts b/tests/cases/conformance/types/literal/literalTypeWidening.ts new file mode 100644 index 00000000000..98ed328f0d2 --- /dev/null +++ b/tests/cases/conformance/types/literal/literalTypeWidening.ts @@ -0,0 +1,97 @@ +// 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(); \ No newline at end of file