Skip to content

Commit 0a0b227

Browse files
committed
Add regression test
1 parent f483738 commit 0a0b227

File tree

4 files changed

+212
-0
lines changed

4 files changed

+212
-0
lines changed

tests/baselines/reference/correlatedUnions.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,26 @@ function ff1() {
157157
const x1 = apply('sum', 1, 2)
158158
const x2 = apply('concat', 'str1', 'str2', 'str3' )
159159
}
160+
161+
// Repro from #47368
162+
163+
type ArgMap = { a: number, b: string };
164+
type Func<K extends keyof ArgMap> = (x: ArgMap[K]) => void;
165+
type Funcs = { [K in keyof ArgMap]: Func<K> };
166+
167+
function f1<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
168+
funcs[key](arg);
169+
}
170+
171+
function f2<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
172+
const func = funcs[key]; // Type Funcs[K]
173+
func(arg);
174+
}
175+
176+
function f3<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
177+
const func: Func<K> = funcs[key]; // Error, Funcs[K] not assignable to Func<K>
178+
func(arg);
179+
}
160180

161181

162182
//// [correlatedUnions.js]
@@ -244,6 +264,17 @@ function ff1() {
244264
var x1 = apply('sum', 1, 2);
245265
var x2 = apply('concat', 'str1', 'str2', 'str3');
246266
}
267+
function f1(funcs, key, arg) {
268+
funcs[key](arg);
269+
}
270+
function f2(funcs, key, arg) {
271+
var func = funcs[key]; // Type Funcs[K]
272+
func(arg);
273+
}
274+
function f3(funcs, key, arg) {
275+
var func = funcs[key]; // Error, Funcs[K] not assignable to Func<K>
276+
func(arg);
277+
}
247278

248279

249280
//// [correlatedUnions.d.ts]
@@ -348,3 +379,14 @@ declare const scrollEvent: {
348379
readonly callback: (ev: Event) => void;
349380
};
350381
declare function ff1(): void;
382+
declare type ArgMap = {
383+
a: number;
384+
b: string;
385+
};
386+
declare type Func<K extends keyof ArgMap> = (x: ArgMap[K]) => void;
387+
declare type Funcs = {
388+
[K in keyof ArgMap]: Func<K>;
389+
};
390+
declare function f1<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]): void;
391+
declare function f2<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]): void;
392+
declare function f3<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]): void;

tests/baselines/reference/correlatedUnions.symbols

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,3 +573,89 @@ function ff1() {
573573
>apply : Symbol(apply, Decl(correlatedUnions.ts, 150, 5))
574574
}
575575

576+
// Repro from #47368
577+
578+
type ArgMap = { a: number, b: string };
579+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
580+
>a : Symbol(a, Decl(correlatedUnions.ts, 161, 15))
581+
>b : Symbol(b, Decl(correlatedUnions.ts, 161, 26))
582+
583+
type Func<K extends keyof ArgMap> = (x: ArgMap[K]) => void;
584+
>Func : Symbol(Func, Decl(correlatedUnions.ts, 161, 39))
585+
>K : Symbol(K, Decl(correlatedUnions.ts, 162, 10))
586+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
587+
>x : Symbol(x, Decl(correlatedUnions.ts, 162, 37))
588+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
589+
>K : Symbol(K, Decl(correlatedUnions.ts, 162, 10))
590+
591+
type Funcs = { [K in keyof ArgMap]: Func<K> };
592+
>Funcs : Symbol(Funcs, Decl(correlatedUnions.ts, 162, 59))
593+
>K : Symbol(K, Decl(correlatedUnions.ts, 163, 16))
594+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
595+
>Func : Symbol(Func, Decl(correlatedUnions.ts, 161, 39))
596+
>K : Symbol(K, Decl(correlatedUnions.ts, 163, 16))
597+
598+
function f1<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
599+
>f1 : Symbol(f1, Decl(correlatedUnions.ts, 163, 46))
600+
>K : Symbol(K, Decl(correlatedUnions.ts, 165, 12))
601+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
602+
>funcs : Symbol(funcs, Decl(correlatedUnions.ts, 165, 36))
603+
>Funcs : Symbol(Funcs, Decl(correlatedUnions.ts, 162, 59))
604+
>key : Symbol(key, Decl(correlatedUnions.ts, 165, 49))
605+
>K : Symbol(K, Decl(correlatedUnions.ts, 165, 12))
606+
>arg : Symbol(arg, Decl(correlatedUnions.ts, 165, 57))
607+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
608+
>K : Symbol(K, Decl(correlatedUnions.ts, 165, 12))
609+
610+
funcs[key](arg);
611+
>funcs : Symbol(funcs, Decl(correlatedUnions.ts, 165, 36))
612+
>key : Symbol(key, Decl(correlatedUnions.ts, 165, 49))
613+
>arg : Symbol(arg, Decl(correlatedUnions.ts, 165, 57))
614+
}
615+
616+
function f2<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
617+
>f2 : Symbol(f2, Decl(correlatedUnions.ts, 167, 1))
618+
>K : Symbol(K, Decl(correlatedUnions.ts, 169, 12))
619+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
620+
>funcs : Symbol(funcs, Decl(correlatedUnions.ts, 169, 36))
621+
>Funcs : Symbol(Funcs, Decl(correlatedUnions.ts, 162, 59))
622+
>key : Symbol(key, Decl(correlatedUnions.ts, 169, 49))
623+
>K : Symbol(K, Decl(correlatedUnions.ts, 169, 12))
624+
>arg : Symbol(arg, Decl(correlatedUnions.ts, 169, 57))
625+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
626+
>K : Symbol(K, Decl(correlatedUnions.ts, 169, 12))
627+
628+
const func = funcs[key]; // Type Funcs[K]
629+
>func : Symbol(func, Decl(correlatedUnions.ts, 170, 9))
630+
>funcs : Symbol(funcs, Decl(correlatedUnions.ts, 169, 36))
631+
>key : Symbol(key, Decl(correlatedUnions.ts, 169, 49))
632+
633+
func(arg);
634+
>func : Symbol(func, Decl(correlatedUnions.ts, 170, 9))
635+
>arg : Symbol(arg, Decl(correlatedUnions.ts, 169, 57))
636+
}
637+
638+
function f3<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
639+
>f3 : Symbol(f3, Decl(correlatedUnions.ts, 172, 1))
640+
>K : Symbol(K, Decl(correlatedUnions.ts, 174, 12))
641+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
642+
>funcs : Symbol(funcs, Decl(correlatedUnions.ts, 174, 36))
643+
>Funcs : Symbol(Funcs, Decl(correlatedUnions.ts, 162, 59))
644+
>key : Symbol(key, Decl(correlatedUnions.ts, 174, 49))
645+
>K : Symbol(K, Decl(correlatedUnions.ts, 174, 12))
646+
>arg : Symbol(arg, Decl(correlatedUnions.ts, 174, 57))
647+
>ArgMap : Symbol(ArgMap, Decl(correlatedUnions.ts, 157, 1))
648+
>K : Symbol(K, Decl(correlatedUnions.ts, 174, 12))
649+
650+
const func: Func<K> = funcs[key]; // Error, Funcs[K] not assignable to Func<K>
651+
>func : Symbol(func, Decl(correlatedUnions.ts, 175, 9))
652+
>Func : Symbol(Func, Decl(correlatedUnions.ts, 161, 39))
653+
>K : Symbol(K, Decl(correlatedUnions.ts, 174, 12))
654+
>funcs : Symbol(funcs, Decl(correlatedUnions.ts, 174, 36))
655+
>key : Symbol(key, Decl(correlatedUnions.ts, 174, 49))
656+
657+
func(arg);
658+
>func : Symbol(func, Decl(correlatedUnions.ts, 175, 9))
659+
>arg : Symbol(arg, Decl(correlatedUnions.ts, 174, 57))
660+
}
661+

tests/baselines/reference/correlatedUnions.types

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,3 +549,67 @@ function ff1() {
549549
>'str3' : "str3"
550550
}
551551

552+
// Repro from #47368
553+
554+
type ArgMap = { a: number, b: string };
555+
>ArgMap : ArgMap
556+
>a : number
557+
>b : string
558+
559+
type Func<K extends keyof ArgMap> = (x: ArgMap[K]) => void;
560+
>Func : Func<K>
561+
>x : ArgMap[K]
562+
563+
type Funcs = { [K in keyof ArgMap]: Func<K> };
564+
>Funcs : Funcs
565+
566+
function f1<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
567+
>f1 : <K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) => void
568+
>funcs : Funcs
569+
>key : K
570+
>arg : ArgMap[K]
571+
572+
funcs[key](arg);
573+
>funcs[key](arg) : void
574+
>funcs[key] : Funcs[K]
575+
>funcs : Funcs
576+
>key : K
577+
>arg : ArgMap[K]
578+
}
579+
580+
function f2<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
581+
>f2 : <K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) => void
582+
>funcs : Funcs
583+
>key : K
584+
>arg : ArgMap[K]
585+
586+
const func = funcs[key]; // Type Funcs[K]
587+
>func : Funcs[K]
588+
>funcs[key] : Funcs[K]
589+
>funcs : Funcs
590+
>key : K
591+
592+
func(arg);
593+
>func(arg) : void
594+
>func : Funcs[K]
595+
>arg : ArgMap[K]
596+
}
597+
598+
function f3<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
599+
>f3 : <K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) => void
600+
>funcs : Funcs
601+
>key : K
602+
>arg : ArgMap[K]
603+
604+
const func: Func<K> = funcs[key]; // Error, Funcs[K] not assignable to Func<K>
605+
>func : Func<K>
606+
>funcs[key] : Funcs[K]
607+
>funcs : Funcs
608+
>key : K
609+
610+
func(arg);
611+
>func(arg) : void
612+
>func : Func<K>
613+
>arg : ArgMap[K]
614+
}
615+

tests/cases/compiler/correlatedUnions.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,23 @@ function ff1() {
159159
const x1 = apply('sum', 1, 2)
160160
const x2 = apply('concat', 'str1', 'str2', 'str3' )
161161
}
162+
163+
// Repro from #47368
164+
165+
type ArgMap = { a: number, b: string };
166+
type Func<K extends keyof ArgMap> = (x: ArgMap[K]) => void;
167+
type Funcs = { [K in keyof ArgMap]: Func<K> };
168+
169+
function f1<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
170+
funcs[key](arg);
171+
}
172+
173+
function f2<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
174+
const func = funcs[key]; // Type Funcs[K]
175+
func(arg);
176+
}
177+
178+
function f3<K extends keyof ArgMap>(funcs: Funcs, key: K, arg: ArgMap[K]) {
179+
const func: Func<K> = funcs[key]; // Error, Funcs[K] not assignable to Func<K>
180+
func(arg);
181+
}

0 commit comments

Comments
 (0)