File: discriminatedUnionTypes2.errors.txt

package info (click to toggle)
node-typescript 3.3.3333-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 324,548 kB
  • sloc: makefile: 6; sh: 3
file content (108 lines) | stat: -rw-r--r-- 3,413 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
tests/cases/conformance/types/union/discriminatedUnionTypes2.ts(27,30): error TS2322: Type '{ a: null; b: string; c: number; }' is not assignable to type '{ a: null; b: string; } | { a: string; c: number; }'.
  Object literal may only specify known properties, and 'c' does not exist in type '{ a: null; b: string; }'.
tests/cases/conformance/types/union/discriminatedUnionTypes2.ts(32,11): error TS2339: Property 'b' does not exist on type '{ a: 0; b: string; } | { a: T; c: number; }'.
  Property 'b' does not exist on type '{ a: T; c: number; }'.


==== tests/cases/conformance/types/union/discriminatedUnionTypes2.ts (2 errors) ====
    function f10(x : { kind: false, a: string } | { kind: true, b: string } | { kind: string, c: string }) {
        if (x.kind === false) {
            x.a;
        }
        else if (x.kind === true) {
            x.b;
        }
        else {
            x.c;
        }
    }
    
    function f11(x : { kind: false, a: string } | { kind: true, b: string } | { kind: string, c: string }) {
        switch (x.kind) {
            case false:
                x.a;
                break;
            case true:
                x.b;
                break;
            default:
                x.c;
        }
    }
    
    function f13(x: { a: null; b: string } | { a: string, c: number }) {
        x = { a: null, b: "foo", c: 4};  // Error
                                 ~~~~
!!! error TS2322: Type '{ a: null; b: string; c: number; }' is not assignable to type '{ a: null; b: string; } | { a: string; c: number; }'.
!!! error TS2322:   Object literal may only specify known properties, and 'c' does not exist in type '{ a: null; b: string; }'.
    }
    
    function f14<T>(x: { a: 0; b: string } | { a: T, c: number }) {
        if (x.a === 0) {
            x.b;  // Error
              ~
!!! error TS2339: Property 'b' does not exist on type '{ a: 0; b: string; } | { a: T; c: number; }'.
!!! error TS2339:   Property 'b' does not exist on type '{ a: T; c: number; }'.
        }
    }
    
    type Result<T> = { error?: undefined, value: T } | { error: Error };
    
    function f15(x: Result<number>) {
        if (!x.error) {
            x.value;
        }
        else {
            x.error.message;
        }
    }
    
    f15({ value: 10 });
    f15({ error: new Error("boom") });
    
    // Repro from #24193
    
    interface WithError {
        error: Error
        data: null
    }
    
    interface WithoutError<Data> {
        error: null
        data: Data
    }
    
    type DataCarrier<Data> = WithError | WithoutError<Data>
    
    function f20<Data>(carrier: DataCarrier<Data>) {
        if (carrier.error === null) {
            const error: null = carrier.error
            const data: Data = carrier.data
        } else {
            const error: Error = carrier.error
            const data: null = carrier.data
        }
    }
    
    // Repro from #28935
    
    type Foo = { tag: true, x: number } | { tag: false, y: number } | { [x: string]: string };
    
    function f30(foo: Foo) {
        if (foo.tag) {
            foo;
        }
        else {
            foo;
        }
    }
    
    function f31(foo: Foo) {
        if (foo.tag === true) {
            foo;
        }
        else {
            foo;
        }
    }