File: typeGuardsInIfStatement.errors.txt

package info (click to toggle)
node-typescript 4.9.5%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 533,908 kB
  • sloc: javascript: 2,018,330; makefile: 7; sh: 1
file content (147 lines) | stat: -rw-r--r-- 5,054 bytes parent folder | download | duplicates (7)
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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 (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, 
    // the type of a variable or parameter is narrowed by any type guard in the 'if' condition when false.
    function foo(x: number | string) {
        if (typeof x === "string") {
            return x.length; // string
        }
        else {
            return x++; // number
        }
    }
    function foo2(x: number | string) {
        if (typeof x === "string") {
            x = 10;
            return x; // number
        }
        else {
            return x; // number
        }
    }
    function foo3(x: number | string) {
        if (typeof x === "string") {
            x = "Hello";
            return x; // string
        }
        else {
            return x; // number
        }
    }
    function foo4(x: number | string) {
        if (typeof x === "string") {
            return x; // string
        }
        else {
            x = 10;
            return x; // number
        }
    }
    function foo5(x: number | string) {
        if (typeof x === "string") {
            return x; // string
        }
        else {
            x = "hello";
            return x; // string
        }
    }
    function foo6(x: number | string) {
        if (typeof x === "string") {
            x = 10;
            return x; // number
        }
        else {
            x = "hello";
            return x; // string
        }
    }
    function foo7(x: number | string | boolean) {
        if (typeof x === "string") {
            return x === "hello"; // string
        }
        else if (typeof x === "boolean") {
            return x; // boolean
        }
        else {
            return x == 10; // number
        }
    }
    function foo8(x: number | string | boolean) {
        if (typeof x === "string") {
            return x === "hello"; // string
        }
        else {
            var b: number | boolean = x; //  number | boolean
            if (typeof x === "boolean") {
                return x; // boolean
            }
            else {
                return x == 10; // number
            }
        }
    }
    function foo9(x: number | string) {
        var y = 10;
        if (typeof x === "string") {
            // usage of x or assignment to separate variable shouldn't cause narrowing of type to stop
            y = x.length; 
            return x === "hello"; // string
        }
        else {
            return x == 10; // number
        }
    }
    function foo10(x: number | string | boolean) {
        // Mixing typeguard narrowing in if statement with conditional expression typeguard
        if (typeof x === "string") {
            return x === "hello"; // string
        }
        else {
            var y: boolean | string;
            var b = x; // number | boolean
            return typeof x === "number"
                ? x === 10 // number
                : x; // x should be boolean
        }
    }
    function foo11(x: number | string | boolean) {
        // Mixing typeguard narrowing in if statement with conditional expression typeguard
        // Assigning value to x deep inside another guard stops narrowing of type too
        if (typeof x === "string") {
            return x; // string | number | boolean - x changed in else branch
        }
        else {
            var y: number| boolean | string;
            var b = x; // number | boolean | string - because below we are changing value of x in if statement
            return typeof x === "number"
                ? (
                // change value of x
                x = 10 && x.toString() // number | boolean | string
                )
                : (
                // do not change value
                y = x && x.toString() // number | boolean | string
                );
        }
    }
    function foo12(x: number | string | boolean) {
        // Mixing typeguard narrowing in if statement with conditional expression typeguard
        // Assigning value to x in outer guard shouldn't stop narrowing in the inner expression
        if (typeof x === "string") {
            return x.toString(); // string | number | boolean - x changed in else branch
        }
        else {
            x = 10;
            var b = x; // number | boolean | string
            return typeof x === "number"
                ? x.toString() // number
                : x.toString(); // boolean | string
                    ~~~~~~~~
!!! error TS2339: Property 'toString' does not exist on type 'never'.
        }
    }