Skip to content

Commit d6de73b

Browse files
authored
Instantiate rest type as needed in getNarrowedTypeOfSymbol (#52215)
1 parent 36e9570 commit d6de73b

6 files changed

+200
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27285,7 +27285,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2728527285
if (func.parameters.length >= 2 && isContextSensitiveFunctionOrObjectLiteralMethod(func)) {
2728627286
const contextualSignature = getContextualSignature(func);
2728727287
if (contextualSignature && contextualSignature.parameters.length === 1 && signatureHasRestParameter(contextualSignature)) {
27288-
const restType = getReducedApparentType(getTypeOfSymbol(contextualSignature.parameters[0]));
27288+
const restType = getReducedApparentType(instantiateType(getTypeOfSymbol(contextualSignature.parameters[0]), getInferenceContext(func)?.nonFixingMapper));
2728927289
if (restType.flags & TypeFlags.Union && everyType(restType, isTupleType) && !isSymbolAssigned(symbol)) {
2729027290
const narrowedType = getFlowTypeOfReference(func, restType, restType, /*flowContainer*/ undefined, location.flowNode);
2729127291
const index = func.parameters.indexOf(declaration) - (getThisParameter(func) ? 1 : 0);

tests/baselines/reference/dependentDestructuredVariables.errors.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,4 +394,19 @@ tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts(334,5): er
394394
}
395395
}
396396
}
397+
398+
// Repro from #52152
399+
400+
interface ClientEvents {
401+
warn: [message: string];
402+
shardDisconnect: [closeEvent: CloseEvent, shardId: number];
403+
}
404+
405+
declare class Client {
406+
public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): void;
407+
}
408+
409+
const bot = new Client();
410+
bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`));
411+
bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`));
397412

tests/baselines/reference/dependentDestructuredVariables.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,21 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value)
386386
}
387387
}
388388
}
389+
390+
// Repro from #52152
391+
392+
interface ClientEvents {
393+
warn: [message: string];
394+
shardDisconnect: [closeEvent: CloseEvent, shardId: number];
395+
}
396+
397+
declare class Client {
398+
public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): void;
399+
}
400+
401+
const bot = new Client();
402+
bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`));
403+
bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`));
389404

390405

391406
//// [dependentDestructuredVariables.js]
@@ -687,6 +702,9 @@ const fa3 = (guard, value) => {
687702
}
688703
}
689704
};
705+
const bot = new Client();
706+
bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`));
707+
bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`));
690708

691709

692710
//// [dependentDestructuredVariables.d.ts]
@@ -827,3 +845,11 @@ declare function fa2(x: {
827845
value: string;
828846
}): void;
829847
declare const fa3: (...args: [true, number] | [false, string]) => void;
848+
interface ClientEvents {
849+
warn: [message: string];
850+
shardDisconnect: [closeEvent: CloseEvent, shardId: number];
851+
}
852+
declare class Client {
853+
on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): void;
854+
}
855+
declare const bot: Client;

tests/baselines/reference/dependentDestructuredVariables.symbols

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,3 +965,73 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value)
965965
}
966966
}
967967

968+
// Repro from #52152
969+
970+
interface ClientEvents {
971+
>ClientEvents : Symbol(ClientEvents, Decl(dependentDestructuredVariables.ts, 386, 1))
972+
973+
warn: [message: string];
974+
>warn : Symbol(ClientEvents.warn, Decl(dependentDestructuredVariables.ts, 390, 24))
975+
976+
shardDisconnect: [closeEvent: CloseEvent, shardId: number];
977+
>shardDisconnect : Symbol(ClientEvents.shardDisconnect, Decl(dependentDestructuredVariables.ts, 391, 28))
978+
>CloseEvent : Symbol(CloseEvent, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
979+
}
980+
981+
declare class Client {
982+
>Client : Symbol(Client, Decl(dependentDestructuredVariables.ts, 393, 1))
983+
984+
public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): void;
985+
>on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22))
986+
>K : Symbol(K, Decl(dependentDestructuredVariables.ts, 396, 14))
987+
>ClientEvents : Symbol(ClientEvents, Decl(dependentDestructuredVariables.ts, 386, 1))
988+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 396, 44))
989+
>K : Symbol(K, Decl(dependentDestructuredVariables.ts, 396, 14))
990+
>listener : Symbol(listener, Decl(dependentDestructuredVariables.ts, 396, 53))
991+
>args : Symbol(args, Decl(dependentDestructuredVariables.ts, 396, 65))
992+
>ClientEvents : Symbol(ClientEvents, Decl(dependentDestructuredVariables.ts, 386, 1))
993+
>K : Symbol(K, Decl(dependentDestructuredVariables.ts, 396, 14))
994+
}
995+
996+
const bot = new Client();
997+
>bot : Symbol(bot, Decl(dependentDestructuredVariables.ts, 399, 5))
998+
>Client : Symbol(Client, Decl(dependentDestructuredVariables.ts, 393, 1))
999+
1000+
bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`));
1001+
>bot.on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22))
1002+
>bot : Symbol(bot, Decl(dependentDestructuredVariables.ts, 399, 5))
1003+
>on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22))
1004+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27))
1005+
>shard : Symbol(shard, Decl(dependentDestructuredVariables.ts, 400, 33))
1006+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
1007+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
1008+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
1009+
>shard : Symbol(shard, Decl(dependentDestructuredVariables.ts, 400, 33))
1010+
>event.code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --))
1011+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27))
1012+
>code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --))
1013+
>event.wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --))
1014+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27))
1015+
>wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --))
1016+
>event.reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --))
1017+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 400, 27))
1018+
>reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --))
1019+
1020+
bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`));
1021+
>bot.on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22))
1022+
>bot : Symbol(bot, Decl(dependentDestructuredVariables.ts, 399, 5))
1023+
>on : Symbol(Client.on, Decl(dependentDestructuredVariables.ts, 395, 22))
1024+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25))
1025+
>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
1026+
>console : Symbol(console, Decl(lib.dom.d.ts, --, --))
1027+
>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --))
1028+
>event.code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --))
1029+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25))
1030+
>code : Symbol(CloseEvent.code, Decl(lib.dom.d.ts, --, --))
1031+
>event.wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --))
1032+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25))
1033+
>wasClean : Symbol(CloseEvent.wasClean, Decl(lib.dom.d.ts, --, --))
1034+
>event.reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --))
1035+
>event : Symbol(event, Decl(dependentDestructuredVariables.ts, 401, 25))
1036+
>reason : Symbol(CloseEvent.reason, Decl(lib.dom.d.ts, --, --))
1037+

tests/baselines/reference/dependentDestructuredVariables.types

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,3 +1115,76 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value)
11151115
}
11161116
}
11171117

1118+
// Repro from #52152
1119+
1120+
interface ClientEvents {
1121+
warn: [message: string];
1122+
>warn : [message: string]
1123+
1124+
shardDisconnect: [closeEvent: CloseEvent, shardId: number];
1125+
>shardDisconnect : [closeEvent: CloseEvent, shardId: number]
1126+
}
1127+
1128+
declare class Client {
1129+
>Client : Client
1130+
1131+
public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): void;
1132+
>on : <K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void) => void
1133+
>event : K
1134+
>listener : (...args: ClientEvents[K]) => void
1135+
>args : ClientEvents[K]
1136+
}
1137+
1138+
const bot = new Client();
1139+
>bot : Client
1140+
>new Client() : Client
1141+
>Client : typeof Client
1142+
1143+
bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`));
1144+
>bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`)) : void
1145+
>bot.on : <K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void) => void
1146+
>bot : Client
1147+
>on : <K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void) => void
1148+
>"shardDisconnect" : "shardDisconnect"
1149+
>(event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`) : (event: CloseEvent, shard: number) => void
1150+
>event : CloseEvent
1151+
>shard : number
1152+
>console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`) : void
1153+
>console.log : (...data: any[]) => void
1154+
>console : Console
1155+
>log : (...data: any[]) => void
1156+
>`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}` : string
1157+
>shard : number
1158+
>event.code : number
1159+
>event : CloseEvent
1160+
>code : number
1161+
>event.wasClean : boolean
1162+
>event : CloseEvent
1163+
>wasClean : boolean
1164+
>event.reason : string
1165+
>event : CloseEvent
1166+
>reason : string
1167+
1168+
bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`));
1169+
>bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`)) : void
1170+
>bot.on : <K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void) => void
1171+
>bot : Client
1172+
>on : <K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void) => void
1173+
>"shardDisconnect" : "shardDisconnect"
1174+
>event => console.log(`${event.code} ${event.wasClean} ${event.reason}`) : (event: CloseEvent) => void
1175+
>event : CloseEvent
1176+
>console.log(`${event.code} ${event.wasClean} ${event.reason}`) : void
1177+
>console.log : (...data: any[]) => void
1178+
>console : Console
1179+
>log : (...data: any[]) => void
1180+
>`${event.code} ${event.wasClean} ${event.reason}` : string
1181+
>event.code : number
1182+
>event : CloseEvent
1183+
>code : number
1184+
>event.wasClean : boolean
1185+
>event : CloseEvent
1186+
>wasClean : boolean
1187+
>event.reason : string
1188+
>event : CloseEvent
1189+
>reason : string
1190+

tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,18 @@ const fa3: (...args: [true, number] | [false, string]) => void = (guard, value)
390390
}
391391
}
392392
}
393+
394+
// Repro from #52152
395+
396+
interface ClientEvents {
397+
warn: [message: string];
398+
shardDisconnect: [closeEvent: CloseEvent, shardId: number];
399+
}
400+
401+
declare class Client {
402+
public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): void;
403+
}
404+
405+
const bot = new Client();
406+
bot.on("shardDisconnect", (event, shard) => console.log(`Shard ${shard} disconnected (${event.code},${event.wasClean}): ${event.reason}`));
407+
bot.on("shardDisconnect", event => console.log(`${event.code} ${event.wasClean} ${event.reason}`));

0 commit comments

Comments
 (0)