diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e3ff1665adf..a39f1a9a688 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -27285,7 +27285,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (func.parameters.length >= 2 && isContextSensitiveFunctionOrObjectLiteralMethod(func)) { const contextualSignature = getContextualSignature(func); if (contextualSignature && contextualSignature.parameters.length === 1 && signatureHasRestParameter(contextualSignature)) { - const restType = getReducedApparentType(getTypeOfSymbol(contextualSignature.parameters[0])); + const restType = getReducedApparentType(instantiateType(getTypeOfSymbol(contextualSignature.parameters[0]), getInferenceContext(func)?.nonFixingMapper)); if (restType.flags & TypeFlags.Union && everyType(restType, isTupleType) && !isSymbolAssigned(symbol)) { const narrowedType = getFlowTypeOfReference(func, restType, restType, /*flowContainer*/ undefined, location.flowNode); const index = func.parameters.indexOf(declaration) - (getThisParameter(func) ? 1 : 0); diff --git a/tests/baselines/reference/dependentDestructuredVariables.errors.txt b/tests/baselines/reference/dependentDestructuredVariables.errors.txt index 20f9dce5790..85eec233194 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.errors.txt +++ b/tests/baselines/reference/dependentDestructuredVariables.errors.txt @@ -394,4 +394,19 @@ tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts(334,5): er } } } + + // Repro from #52152 + + interface ClientEvents { + warn: [message: string]; + shardDisconnect: [closeEvent: CloseEvent, shardId: number]; + } + + declare class Client { + public on(event: K, listener: (...args: ClientEvents[K]) => void): void; + } + + const bot = new Client(); + bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)); + bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`)); \ No newline at end of file diff --git a/tests/baselines/reference/dependentDestructuredVariables.js b/tests/baselines/reference/dependentDestructuredVariables.js index 1b3316a8471..ac392f390a2 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.js +++ b/tests/baselines/reference/dependentDestructuredVariables.js @@ -386,6 +386,21 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value) } } } + +// Repro from #52152 + +interface ClientEvents { + warn: [message: string]; + shardDisconnect: [closeEvent: CloseEvent, shardId: number]; +} + +declare class Client { + public on(event: K, listener: (...args: ClientEvents[K]) => void): void; +} + +const bot = new Client(); +bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)); +bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`)); //// [dependentDestructuredVariables.js] @@ -687,6 +702,9 @@ const fa3 = (guard, value) => { } } }; +const bot = new Client(); +bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)); +bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`)); //// [dependentDestructuredVariables.d.ts] @@ -827,3 +845,11 @@ declare function fa2(x: { 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; diff --git a/tests/baselines/reference/dependentDestructuredVariables.symbols b/tests/baselines/reference/dependentDestructuredVariables.symbols index 438466e06bd..f554c1c02c6 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.symbols +++ b/tests/baselines/reference/dependentDestructuredVariables.symbols @@ -965,3 +965,73 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value) } } +// Repro from #52152 + +interface ClientEvents { +>ClientEvents : Symbol(ClientEvents, Decl(dependentDestructuredVariables.ts, 386, 1)) + + warn: [message: string]; +>warn : Symbol(ClientEvents.warn, Decl(dependentDestructuredVariables.ts, 390, 24)) + + shardDisconnect: [closeEvent: CloseEvent, shardId: number]; +>shardDisconnect : Symbol(ClientEvents.shardDisconnect, Decl(dependentDestructuredVariables.ts, 391, 28)) +>CloseEvent : Symbol(CloseEvent, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --)) +} + +declare class Client { +>Client : Symbol(Client, Decl(dependentDestructuredVariables.ts, 393, 1)) + + public on(event: K, listener: (...args: ClientEvents[K]) => void): void; +>on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22)) +>K : Symbol(K, Decl(dependentDestructuredVariables.ts, 396, 14)) +>ClientEvents : Symbol(ClientEvents, Decl(dependentDestructuredVariables.ts, 386, 1)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 396, 44)) +>K : Symbol(K, Decl(dependentDestructuredVariables.ts, 396, 14)) +>listener : Symbol(listener, Decl(dependentDestructuredVariables.ts, 396, 53)) +>args : Symbol(args, Decl(dependentDestructuredVariables.ts, 396, 65)) +>ClientEvents : Symbol(ClientEvents, Decl(dependentDestructuredVariables.ts, 386, 1)) +>K : Symbol(K, Decl(dependentDestructuredVariables.ts, 396, 14)) +} + +const bot = new Client(); +>bot : Symbol(bot, Decl(dependentDestructuredVariables.ts, 399, 5)) +>Client : Symbol(Client, Decl(dependentDestructuredVariables.ts, 393, 1)) + +bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)); +>bot.on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22)) +>bot : Symbol(bot, Decl(dependentDestructuredVariables.ts, 399, 5)) +>on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27)) +>shard : Symbol(shard, Decl(dependentDestructuredVariables.ts, 400, 33)) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>shard : Symbol(shard, Decl(dependentDestructuredVariables.ts, 400, 33)) +>event.code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27)) +>code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --)) +>event.wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27)) +>wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --)) +>event.reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27)) +>reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --)) + +bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`)); +>bot.on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22)) +>bot : Symbol(bot, Decl(dependentDestructuredVariables.ts, 399, 5)) +>on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25)) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>event.code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25)) +>code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --)) +>event.wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25)) +>wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --)) +>event.reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --)) +>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25)) +>reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --)) + diff --git a/tests/baselines/reference/dependentDestructuredVariables.types b/tests/baselines/reference/dependentDestructuredVariables.types index 365c8428a36..2899d2a4efc 100644 --- a/tests/baselines/reference/dependentDestructuredVariables.types +++ b/tests/baselines/reference/dependentDestructuredVariables.types @@ -1115,3 +1115,76 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value) } } +// Repro from #52152 + +interface ClientEvents { + warn: [message: string]; +>warn : [message: string] + + shardDisconnect: [closeEvent: CloseEvent, shardId: number]; +>shardDisconnect : [closeEvent: CloseEvent, shardId: number] +} + +declare class Client { +>Client : Client + + public on(event: K, listener: (...args: ClientEvents[K]) => void): void; +>on : (event: K, listener: (...args: ClientEvents[K]) => void) => void +>event : K +>listener : (...args: ClientEvents[K]) => void +>args : ClientEvents[K] +} + +const bot = new Client(); +>bot : Client +>new Client() : Client +>Client : typeof Client + +bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)); +>bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)) : void +>bot.on : (event: K, listener: (...args: ClientEvents[K]) => void) => void +>bot : Client +>on : (event: K, listener: (...args: ClientEvents[K]) => void) => void +>"shardDisconnect" : "shardDisconnect" +>(event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`) : (event: CloseEvent, shard: number) => void +>event : CloseEvent +>shard : number +>console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}` : string +>shard : number +>event.code : number +>event : CloseEvent +>code : number +>event.wasClean : boolean +>event : CloseEvent +>wasClean : boolean +>event.reason : string +>event : CloseEvent +>reason : string + +bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`)); +>bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`)) : void +>bot.on : (event: K, listener: (...args: ClientEvents[K]) => void) => void +>bot : Client +>on : (event: K, listener: (...args: ClientEvents[K]) => void) => void +>"shardDisconnect" : "shardDisconnect" +>event => console.log(`${event.code} ${event.wasClean} ${event.reason}`) : (event: CloseEvent) => void +>event : CloseEvent +>console.log(`${event.code} ${event.wasClean} ${event.reason}`) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>`${event.code} ${event.wasClean} ${event.reason}` : string +>event.code : number +>event : CloseEvent +>code : number +>event.wasClean : boolean +>event : CloseEvent +>wasClean : boolean +>event.reason : string +>event : CloseEvent +>reason : string + diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts index 2d7dc5ae5af..e967ffd1d77 100644 --- a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts +++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts @@ -390,3 +390,18 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value) } } } + +// Repro from #52152 + +interface ClientEvents { + warn: [message: string]; + shardDisconnect: [closeEvent: CloseEvent, shardId: number]; +} + +declare class Client { + public on(event: K, listener: (...args: ClientEvents[K]) => void): void; +} + +const bot = new Client(); +bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)); +bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`));