Skip to content

Commit 244303f

Browse files
make exported destructured discriminated union narrowing work (#59673)
1 parent b8b7a38 commit 244303f

File tree

4 files changed

+150
-1
lines changed

4 files changed

+150
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28732,7 +28732,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2873228732
// parameter declared in the same parameter list is a candidate.
2873328733
if (isIdentifier(expr)) {
2873428734
const symbol = getResolvedSymbol(expr);
28735-
const declaration = symbol.valueDeclaration;
28735+
const declaration = getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration;
2873628736
if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) {
2873728737
return declaration;
2873828738
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//// [tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts] ////
2+
3+
=== dependentDestructuredVariablesWithExport.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/59652
5+
6+
declare function mutuallyEnabledPair(): {
7+
>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0))
8+
9+
discriminator: true,
10+
>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 2, 41))
11+
12+
value: string,
13+
>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24))
14+
15+
} | {
16+
discriminator: false,
17+
>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 5, 7))
18+
19+
value: null | undefined,
20+
>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 6, 25))
21+
}
22+
23+
const { discriminator: discriminator1, value: value1 } = mutuallyEnabledPair()
24+
>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 2, 41), Decl(dependentDestructuredVariablesWithExport.ts, 5, 7))
25+
>discriminator1 : Symbol(discriminator1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 7))
26+
>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24), Decl(dependentDestructuredVariablesWithExport.ts, 6, 25))
27+
>value1 : Symbol(value1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 38))
28+
>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0))
29+
30+
if (discriminator1) {
31+
>discriminator1 : Symbol(discriminator1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 7))
32+
33+
value1;
34+
>value1 : Symbol(value1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 38))
35+
}
36+
37+
export const { discriminator: discriminator2, value: value2 } = mutuallyEnabledPair()
38+
>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 2, 41), Decl(dependentDestructuredVariablesWithExport.ts, 5, 7))
39+
>discriminator2 : Symbol(discriminator2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 14))
40+
>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24), Decl(dependentDestructuredVariablesWithExport.ts, 6, 25))
41+
>value2 : Symbol(value2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 45))
42+
>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0))
43+
44+
if (discriminator2) {
45+
>discriminator2 : Symbol(discriminator2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 14))
46+
47+
value2;
48+
>value2 : Symbol(value2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 45))
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//// [tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts] ////
2+
3+
=== dependentDestructuredVariablesWithExport.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/59652
5+
6+
declare function mutuallyEnabledPair(): {
7+
>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; }
8+
> : ^^^^^^
9+
10+
discriminator: true,
11+
>discriminator : true
12+
> : ^^^^
13+
>true : true
14+
> : ^^^^
15+
16+
value: string,
17+
>value : string
18+
> : ^^^^^^
19+
20+
} | {
21+
discriminator: false,
22+
>discriminator : false
23+
> : ^^^^^
24+
>false : false
25+
> : ^^^^^
26+
27+
value: null | undefined,
28+
>value : null | undefined
29+
> : ^^^^^^^^^^^^^^^^
30+
}
31+
32+
const { discriminator: discriminator1, value: value1 } = mutuallyEnabledPair()
33+
>discriminator : any
34+
> : ^^^
35+
>discriminator1 : boolean
36+
> : ^^^^^^^
37+
>value : any
38+
> : ^^^
39+
>value1 : string | null | undefined
40+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^
41+
>mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; }
42+
> : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^
43+
>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; }
44+
> : ^^^^^^
45+
46+
if (discriminator1) {
47+
>discriminator1 : boolean
48+
> : ^^^^^^^
49+
50+
value1;
51+
>value1 : string
52+
> : ^^^^^^
53+
}
54+
55+
export const { discriminator: discriminator2, value: value2 } = mutuallyEnabledPair()
56+
>discriminator : any
57+
> : ^^^
58+
>discriminator2 : boolean
59+
> : ^^^^^^^
60+
>value : any
61+
> : ^^^
62+
>value2 : string | null | undefined
63+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^
64+
>mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; }
65+
> : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^
66+
>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; }
67+
> : ^^^^^^
68+
69+
if (discriminator2) {
70+
>discriminator2 : boolean
71+
> : ^^^^^^^
72+
73+
value2;
74+
>value2 : string
75+
> : ^^^^^^
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// https://github.com/microsoft/TypeScript/issues/59652
5+
6+
declare function mutuallyEnabledPair(): {
7+
discriminator: true,
8+
value: string,
9+
} | {
10+
discriminator: false,
11+
value: null | undefined,
12+
}
13+
14+
const { discriminator: discriminator1, value: value1 } = mutuallyEnabledPair()
15+
16+
if (discriminator1) {
17+
value1;
18+
}
19+
20+
export const { discriminator: discriminator2, value: value2 } = mutuallyEnabledPair()
21+
22+
if (discriminator2) {
23+
value2;
24+
}

0 commit comments

Comments
 (0)