From a37a9d3a5f762e92b8f8a83900be10bb715bf156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mar=C5=A1=C3=A1lek?= Date: Sun, 18 Aug 2024 14:00:42 +0200 Subject: [PATCH 1/7] make destructured discriminated union narrowing work --- src/compiler/checker.ts | 2 +- .../dependentDestructuredVariables.errors.txt | 18 +- .../dependentDestructuredVariables.js | 174 +++--------------- .../dependentDestructuredVariables.symbols | 32 ++++ .../dependentDestructuredVariables.types | 49 +++++ .../dependentDestructuredVariables.ts | 17 ++ 6 files changed, 138 insertions(+), 154 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 91346429b1774..a1b8ce9e80e29 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28816,7 +28816,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // parameter declared in the same parameter list is a candidate. if (isIdentifier(expr)) { const symbol = getResolvedSymbol(expr); - const declaration = symbol.valueDeclaration; + const declaration = symbol.exportSymbol ? symbol.declarations?.[0] : symbol.valueDeclaration; if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { return declaration; } diff --git a/tests/baselines/reference/dependentDestructuredVariables.errors.txt b/tests/baselines/reference/dependentDestructuredVariables.errors.txt index f6e2dd3d42745..883ceb15f6753 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.errors.txt +++ b/tests/baselines/reference/dependentDestructuredVariables.errors.txt @@ -474,4 +474,20 @@ dependentDestructuredVariables.ts(431,15): error TS2322: Type 'number' is not as x; // 1 | 3 } } - \ No newline at end of file + + // https://github.com/microsoft/TypeScript/issues/59652 + + declare function mutuallyEnabledPair(): { + discriminator: true, + value: string, + } | { + discriminator: false, + value: null | undefined, + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() + + if (discriminator) { + value59652; + } \ No newline at end of file diff --git a/tests/baselines/reference/dependentDestructuredVariables.js b/tests/baselines/reference/dependentDestructuredVariables.js index a91ecf55ada98..d8cd03bf511e6 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.js +++ b/tests/baselines/reference/dependentDestructuredVariables.js @@ -465,10 +465,25 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( x; // 1 | 3 } } - + +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { + discriminator: true, + value: string, + } | { + discriminator: false, + value: null | undefined, + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() + + if (discriminator) { + value59652; + } //// [dependentDestructuredVariables.js] -"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -823,156 +838,11 @@ const parameterReassignedContextualRest1 = (x, y) => { x; // 1 | 3 } }; +export const { discriminator, value: value59652 } = mutuallyEnabledPair(); +if (discriminator) { + value59652; +} //// [dependentDestructuredVariables.d.ts] -type Action = { - kind: 'A'; - payload: number; -} | { - kind: 'B'; - payload: string; -}; -declare function f10({ kind, payload }: Action): void; -declare function f11(action: Action): void; -declare function f12({ kind, payload }: Action): void; -declare function f13({ kind, payload }: T): void; -declare function f14(t: T): void; -type Action2 = { - kind: 'A'; - payload: number | undefined; -} | { - kind: 'B'; - payload: string | undefined; -}; -declare function f20({ kind, payload }: Action2): void; -declare function f21(action: Action2): void; -declare function f22(action: Action2): void; -declare function f23({ kind, payload }: Action2): void; -type Foo = { - kind: 'A'; - isA: true; -} | { - kind: 'B'; - isA: false; -} | { - kind: 'C'; - isA: false; -}; -declare function f30({ kind, isA }: Foo): void; -type Args = ['A', number] | ['B', string]; -declare function f40(...[kind, data]: Args): void; -interface A { - variant: 'a'; - value: T; -} -interface B { - variant: 'b'; - value: Array; -} -type AB = A | B; -declare function printValue(t: T): void; -declare function printValueList(t: Array): void; -declare function unrefined1(ab: AB): void; -type Action3 = { - type: 'add'; - payload: { - toAdd: number; - }; -} | { - type: 'remove'; - payload: { - toRemove: number; - }; -}; -declare const reducerBroken: (state: number, { type, payload }: Action3) => number; -declare var it: Iterator; -declare const value: any, done: boolean | undefined; -declare function f50(cb: (...args: Args) => void): void; -declare const f51: (...args: ['A', number] | ['B', string]) => void; -declare const f52: (...args: ['A', number] | ['B']) => void; -declare function readFile(path: string, callback: (...args: [err: null, data: unknown[]] | [err: Error, data: undefined]) => void): void; -type ReducerArgs = ["add", { - a: number; - b: number; -}] | ["concat", { - firstArr: any[]; - secondArr: any[]; -}]; -declare const reducer: (...args: ReducerArgs) => void; -type FooMethod = { - method(...args: [ - type: "str", - cb: (e: string) => void - ] | [ - type: "num", - cb: (e: number) => void - ]): void; -}; -declare let fooM: FooMethod; -type FooAsyncMethod = { - method(...args: [ - type: "str", - cb: (e: string) => void - ] | [ - type: "num", - cb: (e: number) => void - ]): Promise; -}; -declare let fooAsyncM: FooAsyncMethod; -type FooGenMethod = { - method(...args: [ - type: "str", - cb: (e: string) => void - ] | [ - type: "num", - cb: (e: number) => void - ]): Generator; -}; -declare let fooGenM: FooGenMethod; -type FooAsyncGenMethod = { - method(...args: [ - type: "str", - cb: (e: string) => void - ] | [ - type: "num", - cb: (e: number) => void - ]): AsyncGenerator; -}; -declare let fooAsyncGenM: FooAsyncGenMethod; -type Func = (...args: T) => void; -declare const f60: Func; -declare function foo({ value1, test1, test2, test3, test4, test5, test6, test7, test8, test9 }: { - value1: any; - test1?: any; - test2?: any; - test3?: any; - test4?: any; - test5?: any; - test6?: any; - test7?: any; - test8?: any; - test9?: any; -}): void; -declare function fa1(x: [true, number] | [false, string]): void; -declare function fa2(x: { - guard: true; - value: number; -} | { - guard: false; - value: string; -}): void; -declare const fa3: (...args: [true, number] | [false, string]) => void; -interface ClientEvents { - warn: [message: string]; - shardDisconnect: [closeEvent: CloseEvent, shardId: number]; -} -declare class Client { - on(event: K, listener: (...args: ClientEvents[K]) => void): void; -} -declare const bot: Client; -declare function fz1([x, y]: [1, 2] | [3, 4] | [5]): void; -declare function tooNarrow([x, y]: [1, 1] | [1, 2] | [1]): void; -declare function parameterReassigned1([x, y]: [1, 2] | [3, 4]): void; -declare function parameterReassigned2([x, y]: [1, 2] | [3, 4]): void; -declare const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void; +export declare const discriminator: boolean, value59652: string | null | undefined; diff --git a/tests/baselines/reference/dependentDestructuredVariables.symbols b/tests/baselines/reference/dependentDestructuredVariables.symbols index f3d5beb7b983b..df562a9c7be52 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.symbols +++ b/tests/baselines/reference/dependentDestructuredVariables.symbols @@ -1168,3 +1168,35 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( } } +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { +>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariables.ts, 463, 1)) + + discriminator: true, +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 467, 41)) + + value: string, +>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 468, 24)) + + } | { + discriminator: false, +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 470, 7)) + + value: null | undefined, +>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 471, 25)) + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 476, 16)) +>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 468, 24), Decl(dependentDestructuredVariables.ts, 471, 25)) +>value59652 : Symbol(value59652, Decl(dependentDestructuredVariables.ts, 476, 31)) +>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariables.ts, 463, 1)) + + if (discriminator) { +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 476, 16)) + + value59652; +>value59652 : Symbol(value59652, Decl(dependentDestructuredVariables.ts, 476, 31)) + } diff --git a/tests/baselines/reference/dependentDestructuredVariables.types b/tests/baselines/reference/dependentDestructuredVariables.types index 1b829f101d426..bb0593327e320 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.types +++ b/tests/baselines/reference/dependentDestructuredVariables.types @@ -2067,3 +2067,52 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( } } +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { +>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^ + + discriminator: true, +>discriminator : true +> : ^^^^ +>true : true +> : ^^^^ + + value: string, +>value : string +> : ^^^^^^ + + } | { + discriminator: false, +>discriminator : false +> : ^^^^^ +>false : false +> : ^^^^^ + + value: null | undefined, +>value : null | undefined +> : ^^^^^^^^^^^^^^^^ + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() +>discriminator : boolean +> : ^^^^^^^ +>value : any +> : ^^^ +>value59652 : string | null | undefined +> : ^^^^^^^^^^^^^^^^^^^^^^^^^ +>mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^ +>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^ + + if (discriminator) { +>discriminator : boolean +> : ^^^^^^^ + + value59652; +>value59652 : string +> : ^^^^^^ + } diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts index 67bce5559e9cf..46f64f671da31 100644 --- a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts @@ -467,3 +467,20 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( x; // 1 | 3 } } + +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { + discriminator: true, + value: string, + } | { + discriminator: false, + value: null | undefined, + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() + + if (discriminator) { + value59652; + } \ No newline at end of file From bed3d48a3e39f5b2a0d70cd5bdb16c854a10e993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mar=C5=A1=C3=A1lek?= Date: Mon, 19 Aug 2024 06:51:56 +0200 Subject: [PATCH 2/7] use getExportSymbolOfValueSymbolIfExported --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a1b8ce9e80e29..198cf32c4620f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28816,7 +28816,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // parameter declared in the same parameter list is a candidate. if (isIdentifier(expr)) { const symbol = getResolvedSymbol(expr); - const declaration = symbol.exportSymbol ? symbol.declarations?.[0] : symbol.valueDeclaration; + const declaration = getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration; if (declaration && (isBindingElement(declaration) || isParameter(declaration)) && reference === declaration.parent && !declaration.initializer && !declaration.dotDotDotToken) { return declaration; } From 1ff6ab0d4d8bf1febf5df50dd88749547d78cf46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mar=C5=A1=C3=A1lek?= Date: Mon, 19 Aug 2024 08:30:51 +0200 Subject: [PATCH 3/7] move new testcase to a new file --- .../dependentDestructuredVariables.errors.txt | 19 +- .../dependentDestructuredVariables.js | 175 +++++++++++++++--- .../dependentDestructuredVariables.symbols | 33 ---- .../dependentDestructuredVariables.types | 50 ----- ...ependentDestructuredVariablesWithExport.js | 30 +++ ...entDestructuredVariablesWithExport.symbols | 35 ++++ ...ndentDestructuredVariablesWithExport.types | 52 ++++++ .../dependentDestructuredVariables.ts | 19 +- ...ependentDestructuredVariablesWithExport.ts | 16 ++ 9 files changed, 287 insertions(+), 142 deletions(-) create mode 100644 tests/baselines/reference/dependentDestructuredVariablesWithExport.js create mode 100644 tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols create mode 100644 tests/baselines/reference/dependentDestructuredVariablesWithExport.types create mode 100644 tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts diff --git a/tests/baselines/reference/dependentDestructuredVariables.errors.txt b/tests/baselines/reference/dependentDestructuredVariables.errors.txt index 883ceb15f6753..9db2aa68b977d 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.errors.txt +++ b/tests/baselines/reference/dependentDestructuredVariables.errors.txt @@ -473,21 +473,4 @@ dependentDestructuredVariables.ts(431,15): error TS2322: Type 'number' is not as if (y === 2) { x; // 1 | 3 } - } - - // https://github.com/microsoft/TypeScript/issues/59652 - - declare function mutuallyEnabledPair(): { - discriminator: true, - value: string, - } | { - discriminator: false, - value: null | undefined, - } - - - export const { discriminator, value: value59652 } = mutuallyEnabledPair() - - if (discriminator) { - value59652; - } \ No newline at end of file + } \ No newline at end of file diff --git a/tests/baselines/reference/dependentDestructuredVariables.js b/tests/baselines/reference/dependentDestructuredVariables.js index d8cd03bf511e6..9b8c675882220 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.js +++ b/tests/baselines/reference/dependentDestructuredVariables.js @@ -464,26 +464,10 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( if (y === 2) { x; // 1 | 3 } -} - -// https://github.com/microsoft/TypeScript/issues/59652 - -declare function mutuallyEnabledPair(): { - discriminator: true, - value: string, - } | { - discriminator: false, - value: null | undefined, - } - - - export const { discriminator, value: value59652 } = mutuallyEnabledPair() - - if (discriminator) { - value59652; - } +} //// [dependentDestructuredVariables.js] +"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -838,11 +822,156 @@ const parameterReassignedContextualRest1 = (x, y) => { x; // 1 | 3 } }; -export const { discriminator, value: value59652 } = mutuallyEnabledPair(); -if (discriminator) { - value59652; -} //// [dependentDestructuredVariables.d.ts] -export declare const discriminator: boolean, value59652: string | null | undefined; +type Action = { + kind: 'A'; + payload: number; +} | { + kind: 'B'; + payload: string; +}; +declare function f10({ kind, payload }: Action): void; +declare function f11(action: Action): void; +declare function f12({ kind, payload }: Action): void; +declare function f13({ kind, payload }: T): void; +declare function f14(t: T): void; +type Action2 = { + kind: 'A'; + payload: number | undefined; +} | { + kind: 'B'; + payload: string | undefined; +}; +declare function f20({ kind, payload }: Action2): void; +declare function f21(action: Action2): void; +declare function f22(action: Action2): void; +declare function f23({ kind, payload }: Action2): void; +type Foo = { + kind: 'A'; + isA: true; +} | { + kind: 'B'; + isA: false; +} | { + kind: 'C'; + isA: false; +}; +declare function f30({ kind, isA }: Foo): void; +type Args = ['A', number] | ['B', string]; +declare function f40(...[kind, data]: Args): void; +interface A { + variant: 'a'; + value: T; +} +interface B { + variant: 'b'; + value: Array; +} +type AB = A | B; +declare function printValue(t: T): void; +declare function printValueList(t: Array): void; +declare function unrefined1(ab: AB): void; +type Action3 = { + type: 'add'; + payload: { + toAdd: number; + }; +} | { + type: 'remove'; + payload: { + toRemove: number; + }; +}; +declare const reducerBroken: (state: number, { type, payload }: Action3) => number; +declare var it: Iterator; +declare const value: any, done: boolean | undefined; +declare function f50(cb: (...args: Args) => void): void; +declare const f51: (...args: ['A', number] | ['B', string]) => void; +declare const f52: (...args: ['A', number] | ['B']) => void; +declare function readFile(path: string, callback: (...args: [err: null, data: unknown[]] | [err: Error, data: undefined]) => void): void; +type ReducerArgs = ["add", { + a: number; + b: number; +}] | ["concat", { + firstArr: any[]; + secondArr: any[]; +}]; +declare const reducer: (...args: ReducerArgs) => void; +type FooMethod = { + method(...args: [ + type: "str", + cb: (e: string) => void + ] | [ + type: "num", + cb: (e: number) => void + ]): void; +}; +declare let fooM: FooMethod; +type FooAsyncMethod = { + method(...args: [ + type: "str", + cb: (e: string) => void + ] | [ + type: "num", + cb: (e: number) => void + ]): Promise; +}; +declare let fooAsyncM: FooAsyncMethod; +type FooGenMethod = { + method(...args: [ + type: "str", + cb: (e: string) => void + ] | [ + type: "num", + cb: (e: number) => void + ]): Generator; +}; +declare let fooGenM: FooGenMethod; +type FooAsyncGenMethod = { + method(...args: [ + type: "str", + cb: (e: string) => void + ] | [ + type: "num", + cb: (e: number) => void + ]): AsyncGenerator; +}; +declare let fooAsyncGenM: FooAsyncGenMethod; +type Func = (...args: T) => void; +declare const f60: Func; +declare function foo({ value1, test1, test2, test3, test4, test5, test6, test7, test8, test9 }: { + value1: any; + test1?: any; + test2?: any; + test3?: any; + test4?: any; + test5?: any; + test6?: any; + test7?: any; + test8?: any; + test9?: any; +}): void; +declare function fa1(x: [true, number] | [false, string]): void; +declare function fa2(x: { + guard: true; + value: number; +} | { + guard: false; + value: string; +}): void; +declare const fa3: (...args: [true, number] | [false, string]) => void; +interface ClientEvents { + warn: [message: string]; + shardDisconnect: [closeEvent: CloseEvent, shardId: number]; +} +declare class Client { + on(event: K, listener: (...args: ClientEvents[K]) => void): void; +} +declare const bot: Client; +declare function fz1([x, y]: [1, 2] | [3, 4] | [5]): void; +declare function tooNarrow([x, y]: [1, 1] | [1, 2] | [1]): void; +declare function parameterReassigned1([x, y]: [1, 2] | [3, 4]): void; +declare function parameterReassigned2([x, y]: [1, 2] | [3, 4]): void; +declare const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void; diff --git a/tests/baselines/reference/dependentDestructuredVariables.symbols b/tests/baselines/reference/dependentDestructuredVariables.symbols index df562a9c7be52..1f942e8ba9100 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.symbols +++ b/tests/baselines/reference/dependentDestructuredVariables.symbols @@ -1167,36 +1167,3 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( >x : Symbol(x, Decl(dependentDestructuredVariables.ts, 456, 80)) } } - -// https://github.com/microsoft/TypeScript/issues/59652 - -declare function mutuallyEnabledPair(): { ->mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariables.ts, 463, 1)) - - discriminator: true, ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 467, 41)) - - value: string, ->value : Symbol(value, Decl(dependentDestructuredVariables.ts, 468, 24)) - - } | { - discriminator: false, ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 470, 7)) - - value: null | undefined, ->value : Symbol(value, Decl(dependentDestructuredVariables.ts, 471, 25)) - } - - - export const { discriminator, value: value59652 } = mutuallyEnabledPair() ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 476, 16)) ->value : Symbol(value, Decl(dependentDestructuredVariables.ts, 468, 24), Decl(dependentDestructuredVariables.ts, 471, 25)) ->value59652 : Symbol(value59652, Decl(dependentDestructuredVariables.ts, 476, 31)) ->mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariables.ts, 463, 1)) - - if (discriminator) { ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariables.ts, 476, 16)) - - value59652; ->value59652 : Symbol(value59652, Decl(dependentDestructuredVariables.ts, 476, 31)) - } diff --git a/tests/baselines/reference/dependentDestructuredVariables.types b/tests/baselines/reference/dependentDestructuredVariables.types index bb0593327e320..0b28b805cad31 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.types +++ b/tests/baselines/reference/dependentDestructuredVariables.types @@ -2066,53 +2066,3 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( > : ^^^^^ } } - -// https://github.com/microsoft/TypeScript/issues/59652 - -declare function mutuallyEnabledPair(): { ->mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } -> : ^^^^^^ - - discriminator: true, ->discriminator : true -> : ^^^^ ->true : true -> : ^^^^ - - value: string, ->value : string -> : ^^^^^^ - - } | { - discriminator: false, ->discriminator : false -> : ^^^^^ ->false : false -> : ^^^^^ - - value: null | undefined, ->value : null | undefined -> : ^^^^^^^^^^^^^^^^ - } - - - export const { discriminator, value: value59652 } = mutuallyEnabledPair() ->discriminator : boolean -> : ^^^^^^^ ->value : any -> : ^^^ ->value59652 : string | null | undefined -> : ^^^^^^^^^^^^^^^^^^^^^^^^^ ->mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } -> : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^ ->mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } -> : ^^^^^^ - - if (discriminator) { ->discriminator : boolean -> : ^^^^^^^ - - value59652; ->value59652 : string -> : ^^^^^^ - } diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.js b/tests/baselines/reference/dependentDestructuredVariablesWithExport.js new file mode 100644 index 0000000000000..b23066550fb1b --- /dev/null +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.js @@ -0,0 +1,30 @@ +//// [tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts] //// + +//// [dependentDestructuredVariablesWithExport.ts] +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { + discriminator: true, + value: string, + } | { + discriminator: false, + value: null | undefined, + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() + + if (discriminator) { + value59652; + } + +//// [dependentDestructuredVariablesWithExport.js] +"use strict"; +// https://github.com/microsoft/TypeScript/issues/59652 +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.value59652 = exports.discriminator = void 0; +exports.discriminator = (_a = mutuallyEnabledPair(), _a.discriminator), exports.value59652 = _a.value; +if (exports.discriminator) { + exports.value59652; +} diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols new file mode 100644 index 0000000000000..b3e4c86e5a2f6 --- /dev/null +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols @@ -0,0 +1,35 @@ +//// [tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts] //// + +=== dependentDestructuredVariablesWithExport.ts === +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { +>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0)) + + discriminator: true, +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 2, 41)) + + value: string, +>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24)) + + } | { + discriminator: false, +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 5, 7)) + + value: null | undefined, +>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 6, 25)) + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 16)) +>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24), Decl(dependentDestructuredVariablesWithExport.ts, 6, 25)) +>value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 31)) +>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0)) + + if (discriminator) { +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 16)) + + value59652; +>value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 31)) + } diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.types b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types new file mode 100644 index 0000000000000..a4090a54ba59b --- /dev/null +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types @@ -0,0 +1,52 @@ +//// [tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts] //// + +=== dependentDestructuredVariablesWithExport.ts === +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { +>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^ + + discriminator: true, +>discriminator : true +> : ^^^^ +>true : true +> : ^^^^ + + value: string, +>value : string +> : ^^^^^^ + + } | { + discriminator: false, +>discriminator : false +> : ^^^^^ +>false : false +> : ^^^^^ + + value: null | undefined, +>value : null +> : ^^^^ + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() +>discriminator : boolean +> : ^^^^^^^ +>value : any +> : ^^^ +>value59652 : string +> : ^^^^^^ +>mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^ +>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^ + + if (discriminator) { +>discriminator : boolean +> : ^^^^^^^ + + value59652; +>value59652 : string +> : ^^^^^^ + } diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts index 46f64f671da31..7ae12f46eab77 100644 --- a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts @@ -466,21 +466,4 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( if (y === 2) { x; // 1 | 3 } -} - -// https://github.com/microsoft/TypeScript/issues/59652 - -declare function mutuallyEnabledPair(): { - discriminator: true, - value: string, - } | { - discriminator: false, - value: null | undefined, - } - - - export const { discriminator, value: value59652 } = mutuallyEnabledPair() - - if (discriminator) { - value59652; - } \ No newline at end of file +} \ No newline at end of file diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts new file mode 100644 index 0000000000000..28bb593cfd6ea --- /dev/null +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts @@ -0,0 +1,16 @@ +// https://github.com/microsoft/TypeScript/issues/59652 + +declare function mutuallyEnabledPair(): { + discriminator: true, + value: string, + } | { + discriminator: false, + value: null | undefined, + } + + + export const { discriminator, value: value59652 } = mutuallyEnabledPair() + + if (discriminator) { + value59652; + } \ No newline at end of file From 7c2adea2004815b75eaef80f6158666331422ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mar=C5=A1=C3=A1lek?= Date: Mon, 19 Aug 2024 08:45:48 +0200 Subject: [PATCH 4/7] formatting --- ...dependentDestructuredVariablesWithExport.js | 10 +++++----- ...dentDestructuredVariablesWithExport.symbols | 18 +++++++++--------- ...endentDestructuredVariablesWithExport.types | 10 +++++----- ...dependentDestructuredVariablesWithExport.ts | 10 +++++----- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.js b/tests/baselines/reference/dependentDestructuredVariablesWithExport.js index b23066550fb1b..7c2d8878b2cbc 100644 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.js +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.js @@ -12,11 +12,11 @@ declare function mutuallyEnabledPair(): { } - export const { discriminator, value: value59652 } = mutuallyEnabledPair() - - if (discriminator) { - value59652; - } +export const { discriminator, value: value59652 } = mutuallyEnabledPair() + +if (discriminator) { + value59652; +} //// [dependentDestructuredVariablesWithExport.js] "use strict"; diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols index b3e4c86e5a2f6..db2cb7717240d 100644 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols @@ -21,15 +21,15 @@ declare function mutuallyEnabledPair(): { } - export const { discriminator, value: value59652 } = mutuallyEnabledPair() ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 16)) +export const { discriminator, value: value59652 } = mutuallyEnabledPair() +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 14)) >value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24), Decl(dependentDestructuredVariablesWithExport.ts, 6, 25)) ->value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 31)) +>value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) >mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0)) - - if (discriminator) { ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 16)) - value59652; ->value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 31)) - } +if (discriminator) { +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 14)) + + value59652; +>value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) +} diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.types b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types index a4090a54ba59b..d1166445e3d76 100644 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.types +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types @@ -30,7 +30,7 @@ declare function mutuallyEnabledPair(): { } - export const { discriminator, value: value59652 } = mutuallyEnabledPair() +export const { discriminator, value: value59652 } = mutuallyEnabledPair() >discriminator : boolean > : ^^^^^^^ >value : any @@ -41,12 +41,12 @@ declare function mutuallyEnabledPair(): { > : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^ >mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } > : ^^^^^^ - - if (discriminator) { + +if (discriminator) { >discriminator : boolean > : ^^^^^^^ - value59652; + value59652; >value59652 : string > : ^^^^^^ - } +} diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts index 28bb593cfd6ea..e07bac90af128 100644 --- a/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts @@ -9,8 +9,8 @@ declare function mutuallyEnabledPair(): { } - export const { discriminator, value: value59652 } = mutuallyEnabledPair() - - if (discriminator) { - value59652; - } \ No newline at end of file +export const { discriminator, value: value59652 } = mutuallyEnabledPair() + +if (discriminator) { + value59652; +} \ No newline at end of file From e33bc963515a8cace8f4e40b147cd9615079f26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mar=C5=A1=C3=A1lek?= Date: Mon, 19 Aug 2024 08:48:34 +0200 Subject: [PATCH 5/7] formatting --- .../reference/dependentDestructuredVariables.errors.txt | 3 ++- tests/baselines/reference/dependentDestructuredVariables.js | 3 ++- .../baselines/reference/dependentDestructuredVariables.symbols | 1 + tests/baselines/reference/dependentDestructuredVariables.types | 1 + .../conformance/controlFlow/dependentDestructuredVariables.ts | 2 +- 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/baselines/reference/dependentDestructuredVariables.errors.txt b/tests/baselines/reference/dependentDestructuredVariables.errors.txt index 9db2aa68b977d..f6e2dd3d42745 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.errors.txt +++ b/tests/baselines/reference/dependentDestructuredVariables.errors.txt @@ -473,4 +473,5 @@ dependentDestructuredVariables.ts(431,15): error TS2322: Type 'number' is not as if (y === 2) { x; // 1 | 3 } - } \ No newline at end of file + } + \ No newline at end of file diff --git a/tests/baselines/reference/dependentDestructuredVariables.js b/tests/baselines/reference/dependentDestructuredVariables.js index 9b8c675882220..a91ecf55ada98 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.js +++ b/tests/baselines/reference/dependentDestructuredVariables.js @@ -464,7 +464,8 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( if (y === 2) { x; // 1 | 3 } -} +} + //// [dependentDestructuredVariables.js] "use strict"; diff --git a/tests/baselines/reference/dependentDestructuredVariables.symbols b/tests/baselines/reference/dependentDestructuredVariables.symbols index 1f942e8ba9100..f3d5beb7b983b 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.symbols +++ b/tests/baselines/reference/dependentDestructuredVariables.symbols @@ -1167,3 +1167,4 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( >x : Symbol(x, Decl(dependentDestructuredVariables.ts, 456, 80)) } } + diff --git a/tests/baselines/reference/dependentDestructuredVariables.types b/tests/baselines/reference/dependentDestructuredVariables.types index 0b28b805cad31..1b829f101d426 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.types +++ b/tests/baselines/reference/dependentDestructuredVariables.types @@ -2066,3 +2066,4 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( > : ^^^^^ } } + diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts index 7ae12f46eab77..67bce5559e9cf 100644 --- a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts @@ -466,4 +466,4 @@ const parameterReassignedContextualRest1: (...args: [1, 2] | [3, 4]) => void = ( if (y === 2) { x; // 1 | 3 } -} \ No newline at end of file +} From 68c705a619ef30a17f6f0567689b7b1ace0a3bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mar=C5=A1=C3=A1lek?= Date: Mon, 19 Aug 2024 09:28:39 +0200 Subject: [PATCH 6/7] use testfile options --- ...ependentDestructuredVariablesWithExport.js | 30 ------------------- ...entDestructuredVariablesWithExport.symbols | 9 +++--- ...ndentDestructuredVariablesWithExport.types | 18 +++++------ ...ependentDestructuredVariablesWithExport.ts | 7 +++-- 4 files changed, 17 insertions(+), 47 deletions(-) delete mode 100644 tests/baselines/reference/dependentDestructuredVariablesWithExport.js diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.js b/tests/baselines/reference/dependentDestructuredVariablesWithExport.js deleted file mode 100644 index 7c2d8878b2cbc..0000000000000 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.js +++ /dev/null @@ -1,30 +0,0 @@ -//// [tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts] //// - -//// [dependentDestructuredVariablesWithExport.ts] -// https://github.com/microsoft/TypeScript/issues/59652 - -declare function mutuallyEnabledPair(): { - discriminator: true, - value: string, - } | { - discriminator: false, - value: null | undefined, - } - - -export const { discriminator, value: value59652 } = mutuallyEnabledPair() - -if (discriminator) { - value59652; -} - -//// [dependentDestructuredVariablesWithExport.js] -"use strict"; -// https://github.com/microsoft/TypeScript/issues/59652 -var _a; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.value59652 = exports.discriminator = void 0; -exports.discriminator = (_a = mutuallyEnabledPair(), _a.discriminator), exports.value59652 = _a.value; -if (exports.discriminator) { - exports.value59652; -} diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols index db2cb7717240d..cb50dca5aa7e1 100644 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols @@ -21,15 +21,14 @@ declare function mutuallyEnabledPair(): { } -export const { discriminator, value: value59652 } = mutuallyEnabledPair() +export const { discriminator, value } = mutuallyEnabledPair() >discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 14)) ->value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24), Decl(dependentDestructuredVariablesWithExport.ts, 6, 25)) ->value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) +>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) >mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0)) if (discriminator) { >discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 14)) - value59652; ->value59652 : Symbol(value59652, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) + value; +>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) } diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.types b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types index d1166445e3d76..95f93155eb214 100644 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.types +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types @@ -25,18 +25,16 @@ declare function mutuallyEnabledPair(): { > : ^^^^^ value: null | undefined, ->value : null -> : ^^^^ +>value : null | undefined +> : ^^^^^^^^^^^^^^^^ } -export const { discriminator, value: value59652 } = mutuallyEnabledPair() +export const { discriminator, value } = mutuallyEnabledPair() >discriminator : boolean > : ^^^^^^^ ->value : any -> : ^^^ ->value59652 : string -> : ^^^^^^ +>value : string | null | undefined +> : ^^^^^^^^^^^^^^^^^^^^^^^^^ >mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } > : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^ >mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } @@ -46,7 +44,7 @@ if (discriminator) { >discriminator : boolean > : ^^^^^^^ - value59652; ->value59652 : string -> : ^^^^^^ + value; +>value : string +> : ^^^^^^ } diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts index e07bac90af128..e521c22f341ac 100644 --- a/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts @@ -1,3 +1,6 @@ +// @strict: true +// @noEmit: true + // https://github.com/microsoft/TypeScript/issues/59652 declare function mutuallyEnabledPair(): { @@ -9,8 +12,8 @@ declare function mutuallyEnabledPair(): { } -export const { discriminator, value: value59652 } = mutuallyEnabledPair() +export const { discriminator, value } = mutuallyEnabledPair() if (discriminator) { - value59652; + value; } \ No newline at end of file From a5bee662c3ab0afddae0c9c97a0c44d95ee9dbad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mar=C5=A1=C3=A1lek?= Date: Sun, 23 Feb 2025 11:13:52 +0100 Subject: [PATCH 7/7] include non-exported variant in tests --- ...entDestructuredVariablesWithExport.symbols | 33 ++++++++---- ...ndentDestructuredVariablesWithExport.types | 52 ++++++++++++++----- ...ependentDestructuredVariablesWithExport.ts | 15 ++++-- 3 files changed, 73 insertions(+), 27 deletions(-) diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols index cb50dca5aa7e1..c65d71e28d6b4 100644 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.symbols @@ -19,16 +19,31 @@ declare function mutuallyEnabledPair(): { value: null | undefined, >value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 6, 25)) } - - -export const { discriminator, value } = mutuallyEnabledPair() ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 14)) ->value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) + +const { discriminator: discriminator1, value: value1 } = mutuallyEnabledPair() +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 2, 41), Decl(dependentDestructuredVariablesWithExport.ts, 5, 7)) +>discriminator1 : Symbol(discriminator1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 7)) +>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24), Decl(dependentDestructuredVariablesWithExport.ts, 6, 25)) +>value1 : Symbol(value1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 38)) +>mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0)) + +if (discriminator1) { +>discriminator1 : Symbol(discriminator1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 7)) + + value1; +>value1 : Symbol(value1, Decl(dependentDestructuredVariablesWithExport.ts, 10, 38)) +} + +export const { discriminator: discriminator2, value: value2 } = mutuallyEnabledPair() +>discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 2, 41), Decl(dependentDestructuredVariablesWithExport.ts, 5, 7)) +>discriminator2 : Symbol(discriminator2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 14)) +>value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 3, 24), Decl(dependentDestructuredVariablesWithExport.ts, 6, 25)) +>value2 : Symbol(value2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 45)) >mutuallyEnabledPair : Symbol(mutuallyEnabledPair, Decl(dependentDestructuredVariablesWithExport.ts, 0, 0)) -if (discriminator) { ->discriminator : Symbol(discriminator, Decl(dependentDestructuredVariablesWithExport.ts, 11, 14)) +if (discriminator2) { +>discriminator2 : Symbol(discriminator2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 14)) - value; ->value : Symbol(value, Decl(dependentDestructuredVariablesWithExport.ts, 11, 29)) + value2; +>value2 : Symbol(value2, Decl(dependentDestructuredVariablesWithExport.ts, 16, 45)) } diff --git a/tests/baselines/reference/dependentDestructuredVariablesWithExport.types b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types index 95f93155eb214..09386ce819b5e 100644 --- a/tests/baselines/reference/dependentDestructuredVariablesWithExport.types +++ b/tests/baselines/reference/dependentDestructuredVariablesWithExport.types @@ -28,23 +28,49 @@ declare function mutuallyEnabledPair(): { >value : null | undefined > : ^^^^^^^^^^^^^^^^ } - - -export const { discriminator, value } = mutuallyEnabledPair() ->discriminator : boolean -> : ^^^^^^^ ->value : string | null | undefined -> : ^^^^^^^^^^^^^^^^^^^^^^^^^ + +const { discriminator: discriminator1, value: value1 } = mutuallyEnabledPair() +>discriminator : any +> : ^^^ +>discriminator1 : boolean +> : ^^^^^^^ +>value : any +> : ^^^ +>value1 : string | null | undefined +> : ^^^^^^^^^^^^^^^^^^^^^^^^^ >mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } > : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^ >mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } > : ^^^^^^ -if (discriminator) { ->discriminator : boolean -> : ^^^^^^^ +if (discriminator1) { +>discriminator1 : boolean +> : ^^^^^^^ - value; ->value : string -> : ^^^^^^ + value1; +>value1 : string +> : ^^^^^^ +} + +export const { discriminator: discriminator2, value: value2 } = mutuallyEnabledPair() +>discriminator : any +> : ^^^ +>discriminator2 : boolean +> : ^^^^^^^ +>value : any +> : ^^^ +>value2 : string | null | undefined +> : ^^^^^^^^^^^^^^^^^^^^^^^^^ +>mutuallyEnabledPair() : { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^ +>mutuallyEnabledPair : () => { discriminator: true; value: string; } | { discriminator: false; value: null | undefined; } +> : ^^^^^^ + +if (discriminator2) { +>discriminator2 : boolean +> : ^^^^^^^ + + value2; +>value2 : string +> : ^^^^^^ } diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts index e521c22f341ac..69a7aab62d5a7 100644 --- a/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariablesWithExport.ts @@ -10,10 +10,15 @@ declare function mutuallyEnabledPair(): { discriminator: false, value: null | undefined, } - - -export const { discriminator, value } = mutuallyEnabledPair() -if (discriminator) { - value; +const { discriminator: discriminator1, value: value1 } = mutuallyEnabledPair() + +if (discriminator1) { + value1; +} + +export const { discriminator: discriminator2, value: value2 } = mutuallyEnabledPair() + +if (discriminator2) { + value2; } \ No newline at end of file