Skip to content

Commit b549581

Browse files
committed
add an extra test case
1 parent 2be581e commit b549581

File tree

4 files changed

+148
-22
lines changed

4 files changed

+148
-22
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
controlFlowOptionalChain3.tsx(30,8): error TS18048: 'foo' is possibly 'undefined'.
2+
3+
4+
==== controlFlowOptionalChain3.tsx (1 errors) ====
5+
/// <reference path="/.lib/react16.d.ts" />
6+
7+
// https://github.com/microsoft/TypeScript/issues/56482
8+
9+
import React from "react";
10+
11+
interface Foo {
12+
bar: boolean;
13+
}
14+
15+
function test1(foo: Foo | undefined) {
16+
if (foo?.bar === false) {
17+
foo;
18+
}
19+
foo;
20+
}
21+
22+
function test2(foo: Foo | undefined) {
23+
if (foo?.bar === false) {
24+
foo;
25+
} else {
26+
foo;
27+
}
28+
}
29+
30+
function Test3({ foo }: { foo: Foo | undefined }) {
31+
return (
32+
<div>
33+
{foo?.bar === false && "foo"}
34+
{foo.bar ? "true" : "false"}
35+
~~~
36+
!!! error TS18048: 'foo' is possibly 'undefined'.
37+
</div>
38+
);
39+
}
40+
Lines changed: 51 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,79 @@
1-
//// [tests/cases/conformance/controlFlow/controlFlowOptionalChain3.ts] ////
1+
//// [tests/cases/conformance/controlFlow/controlFlowOptionalChain3.tsx] ////
2+
3+
=== controlFlowOptionalChain3.tsx ===
4+
/// <reference path="react16.d.ts" />
25

3-
=== controlFlowOptionalChain3.ts ===
46
// https://github.com/microsoft/TypeScript/issues/56482
57

8+
import React from "react";
9+
>React : Symbol(React, Decl(controlFlowOptionalChain3.tsx, 4, 6))
10+
611
interface Foo {
7-
>Foo : Symbol(Foo, Decl(controlFlowOptionalChain3.ts, 0, 0))
12+
>Foo : Symbol(Foo, Decl(controlFlowOptionalChain3.tsx, 4, 26))
813

914
bar: boolean;
10-
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.ts, 2, 15))
15+
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
1116
}
1217

1318
function test1(foo: Foo | undefined) {
14-
>test1 : Symbol(test1, Decl(controlFlowOptionalChain3.ts, 4, 1))
15-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 6, 15))
16-
>Foo : Symbol(Foo, Decl(controlFlowOptionalChain3.ts, 0, 0))
19+
>test1 : Symbol(test1, Decl(controlFlowOptionalChain3.tsx, 8, 1))
20+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 10, 15))
21+
>Foo : Symbol(Foo, Decl(controlFlowOptionalChain3.tsx, 4, 26))
1722

1823
if (foo?.bar === false) {
19-
>foo?.bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.ts, 2, 15))
20-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 6, 15))
21-
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.ts, 2, 15))
24+
>foo?.bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
25+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 10, 15))
26+
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
2227

2328
foo;
24-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 6, 15))
29+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 10, 15))
2530
}
2631
foo;
27-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 6, 15))
32+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 10, 15))
2833
}
2934

3035
function test2(foo: Foo | undefined) {
31-
>test2 : Symbol(test2, Decl(controlFlowOptionalChain3.ts, 11, 1))
32-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 13, 15))
33-
>Foo : Symbol(Foo, Decl(controlFlowOptionalChain3.ts, 0, 0))
36+
>test2 : Symbol(test2, Decl(controlFlowOptionalChain3.tsx, 15, 1))
37+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 17, 15))
38+
>Foo : Symbol(Foo, Decl(controlFlowOptionalChain3.tsx, 4, 26))
3439

3540
if (foo?.bar === false) {
36-
>foo?.bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.ts, 2, 15))
37-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 13, 15))
38-
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.ts, 2, 15))
41+
>foo?.bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
42+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 17, 15))
43+
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
3944

4045
foo;
41-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 13, 15))
46+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 17, 15))
4247

4348
} else {
4449
foo;
45-
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.ts, 13, 15))
50+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 17, 15))
4651
}
4752
}
4853

54+
function Test3({ foo }: { foo: Foo | undefined }) {
55+
>Test3 : Symbol(Test3, Decl(controlFlowOptionalChain3.tsx, 23, 1))
56+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 25, 16))
57+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 25, 25))
58+
>Foo : Symbol(Foo, Decl(controlFlowOptionalChain3.tsx, 4, 26))
59+
60+
return (
61+
<div>
62+
>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2546, 114))
63+
64+
{foo?.bar === false && "foo"}
65+
>foo?.bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
66+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 25, 16))
67+
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
68+
69+
{foo.bar ? "true" : "false"}
70+
>foo.bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
71+
>foo : Symbol(foo, Decl(controlFlowOptionalChain3.tsx, 25, 16))
72+
>bar : Symbol(Foo.bar, Decl(controlFlowOptionalChain3.tsx, 6, 15))
73+
74+
</div>
75+
>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2546, 114))
76+
77+
);
78+
}
79+

tests/baselines/reference/controlFlowOptionalChain3.types

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
//// [tests/cases/conformance/controlFlow/controlFlowOptionalChain3.ts] ////
1+
//// [tests/cases/conformance/controlFlow/controlFlowOptionalChain3.tsx] ////
2+
3+
=== controlFlowOptionalChain3.tsx ===
4+
/// <reference path="react16.d.ts" />
25

3-
=== controlFlowOptionalChain3.ts ===
46
// https://github.com/microsoft/TypeScript/issues/56482
57

8+
import React from "react";
9+
>React : typeof React
10+
611
interface Foo {
712
bar: boolean;
813
>bar : boolean
@@ -46,3 +51,38 @@ function test2(foo: Foo | undefined) {
4651
}
4752
}
4853

54+
function Test3({ foo }: { foo: Foo | undefined }) {
55+
>Test3 : ({ foo }: { foo: Foo | undefined; }) => JSX.Element
56+
>foo : Foo | undefined
57+
>foo : Foo | undefined
58+
59+
return (
60+
>( <div> {foo?.bar === false && "foo"} {foo.bar ? "true" : "false"} </div> ) : JSX.Element
61+
62+
<div>
63+
><div> {foo?.bar === false && "foo"} {foo.bar ? "true" : "false"} </div> : JSX.Element
64+
>div : any
65+
66+
{foo?.bar === false && "foo"}
67+
>foo?.bar === false && "foo" : false | "foo"
68+
>foo?.bar === false : boolean
69+
>foo?.bar : boolean | undefined
70+
>foo : Foo | undefined
71+
>bar : boolean | undefined
72+
>false : false
73+
>"foo" : "foo"
74+
75+
{foo.bar ? "true" : "false"}
76+
>foo.bar ? "true" : "false" : "false" | "true"
77+
>foo.bar : boolean
78+
>foo : Foo | undefined
79+
>bar : boolean
80+
>"true" : "true"
81+
>"false" : "false"
82+
83+
</div>
84+
>div : any
85+
86+
);
87+
}
88+

tests/cases/conformance/controlFlow/controlFlowOptionalChain3.ts renamed to tests/cases/conformance/controlFlow/controlFlowOptionalChain3.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
// @strict: true
22
// @noEmit: true
3+
// @esModuleInterop: true
4+
// @jsx: react
5+
6+
/// <reference path="/.lib/react16.d.ts" />
37

48
// https://github.com/microsoft/TypeScript/issues/56482
59

10+
import React from "react";
11+
612
interface Foo {
713
bar: boolean;
814
}
@@ -21,3 +27,12 @@ function test2(foo: Foo | undefined) {
2127
foo;
2228
}
2329
}
30+
31+
function Test3({ foo }: { foo: Foo | undefined }) {
32+
return (
33+
<div>
34+
{foo?.bar === false && "foo"}
35+
{foo.bar ? "true" : "false"}
36+
</div>
37+
);
38+
}

0 commit comments

Comments
 (0)