Skip to content

Commit 9c7f43d

Browse files
authored
Add extra test cases for indexed access on generic mapped type (#53112)
1 parent 43cc362 commit 9c7f43d

File tree

4 files changed

+237
-2
lines changed

4 files changed

+237
-2
lines changed

tests/baselines/reference/correlatedUnions.js

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,38 @@ const getStringAndNumberFromOriginalAndMapped = <
268268
nestedKey: N
269269
): [Original[K][N], MappedFromOriginal[K][N]] => {
270270
return [original[key][nestedKey], mappedFromOriginal[key][nestedKey]];
271-
};
271+
};
272+
273+
// repro from #31675
274+
interface Config {
275+
string: string;
276+
number: number;
277+
}
278+
279+
function getConfigOrDefault<T extends keyof Config>(
280+
userConfig: Partial<Config>,
281+
key: T,
282+
defaultValue: Config[T]
283+
): Config[T] {
284+
const userValue = userConfig[key];
285+
const assertedCheck = userValue ? userValue! : defaultValue;
286+
return assertedCheck;
287+
}
288+
289+
// repro from #47523
290+
291+
type Foo1 = {
292+
x: number;
293+
y: string;
294+
};
295+
296+
function getValueConcrete<K extends keyof Foo1>(
297+
o: Partial<Foo1>,
298+
k: K
299+
): Foo1[K] | undefined {
300+
return o[k];
301+
}
302+
272303

273304
//// [correlatedUnions.js]
274305
"use strict";
@@ -392,6 +423,14 @@ var BAR_LOOKUP = makeCompleteLookupMapping(ALL_BARS, 'name');
392423
var getStringAndNumberFromOriginalAndMapped = function (original, mappedFromOriginal, key, nestedKey) {
393424
return [original[key][nestedKey], mappedFromOriginal[key][nestedKey]];
394425
};
426+
function getConfigOrDefault(userConfig, key, defaultValue) {
427+
var userValue = userConfig[key];
428+
var assertedCheck = userValue ? userValue : defaultValue;
429+
return assertedCheck;
430+
}
431+
function getValueConcrete(o, k) {
432+
return o[k];
433+
}
395434

396435

397436
//// [correlatedUnions.d.ts]
@@ -562,3 +601,13 @@ type SameKeys<T> = {
562601
};
563602
type MappedFromOriginal = SameKeys<Original>;
564603
declare const getStringAndNumberFromOriginalAndMapped: <K extends keyof Original, N extends keyof Original[K]>(original: Original, mappedFromOriginal: MappedFromOriginal, key: K, nestedKey: N) => [Original[K][N], SameKeys<Original>[K][N]];
604+
interface Config {
605+
string: string;
606+
number: number;
607+
}
608+
declare function getConfigOrDefault<T extends keyof Config>(userConfig: Partial<Config>, key: T, defaultValue: Config[T]): Config[T];
609+
type Foo1 = {
610+
x: number;
611+
y: string;
612+
};
613+
declare function getValueConcrete<K extends keyof Foo1>(o: Partial<Foo1>, k: K): Foo1[K] | undefined;

tests/baselines/reference/correlatedUnions.symbols

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,3 +928,89 @@ const getStringAndNumberFromOriginalAndMapped = <
928928
>nestedKey : Symbol(nestedKey, Decl(correlatedUnions.ts, 265, 9))
929929

930930
};
931+
932+
// repro from #31675
933+
interface Config {
934+
>Config : Symbol(Config, Decl(correlatedUnions.ts, 269, 2))
935+
936+
string: string;
937+
>string : Symbol(Config.string, Decl(correlatedUnions.ts, 272, 18))
938+
939+
number: number;
940+
>number : Symbol(Config.number, Decl(correlatedUnions.ts, 273, 17))
941+
}
942+
943+
function getConfigOrDefault<T extends keyof Config>(
944+
>getConfigOrDefault : Symbol(getConfigOrDefault, Decl(correlatedUnions.ts, 275, 1))
945+
>T : Symbol(T, Decl(correlatedUnions.ts, 277, 28))
946+
>Config : Symbol(Config, Decl(correlatedUnions.ts, 269, 2))
947+
948+
userConfig: Partial<Config>,
949+
>userConfig : Symbol(userConfig, Decl(correlatedUnions.ts, 277, 52))
950+
>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
951+
>Config : Symbol(Config, Decl(correlatedUnions.ts, 269, 2))
952+
953+
key: T,
954+
>key : Symbol(key, Decl(correlatedUnions.ts, 278, 30))
955+
>T : Symbol(T, Decl(correlatedUnions.ts, 277, 28))
956+
957+
defaultValue: Config[T]
958+
>defaultValue : Symbol(defaultValue, Decl(correlatedUnions.ts, 279, 9))
959+
>Config : Symbol(Config, Decl(correlatedUnions.ts, 269, 2))
960+
>T : Symbol(T, Decl(correlatedUnions.ts, 277, 28))
961+
962+
): Config[T] {
963+
>Config : Symbol(Config, Decl(correlatedUnions.ts, 269, 2))
964+
>T : Symbol(T, Decl(correlatedUnions.ts, 277, 28))
965+
966+
const userValue = userConfig[key];
967+
>userValue : Symbol(userValue, Decl(correlatedUnions.ts, 282, 7))
968+
>userConfig : Symbol(userConfig, Decl(correlatedUnions.ts, 277, 52))
969+
>key : Symbol(key, Decl(correlatedUnions.ts, 278, 30))
970+
971+
const assertedCheck = userValue ? userValue! : defaultValue;
972+
>assertedCheck : Symbol(assertedCheck, Decl(correlatedUnions.ts, 283, 7))
973+
>userValue : Symbol(userValue, Decl(correlatedUnions.ts, 282, 7))
974+
>userValue : Symbol(userValue, Decl(correlatedUnions.ts, 282, 7))
975+
>defaultValue : Symbol(defaultValue, Decl(correlatedUnions.ts, 279, 9))
976+
977+
return assertedCheck;
978+
>assertedCheck : Symbol(assertedCheck, Decl(correlatedUnions.ts, 283, 7))
979+
}
980+
981+
// repro from #47523
982+
983+
type Foo1 = {
984+
>Foo1 : Symbol(Foo1, Decl(correlatedUnions.ts, 285, 1))
985+
986+
x: number;
987+
>x : Symbol(x, Decl(correlatedUnions.ts, 289, 13))
988+
989+
y: string;
990+
>y : Symbol(y, Decl(correlatedUnions.ts, 290, 12))
991+
992+
};
993+
994+
function getValueConcrete<K extends keyof Foo1>(
995+
>getValueConcrete : Symbol(getValueConcrete, Decl(correlatedUnions.ts, 292, 2))
996+
>K : Symbol(K, Decl(correlatedUnions.ts, 294, 26))
997+
>Foo1 : Symbol(Foo1, Decl(correlatedUnions.ts, 285, 1))
998+
999+
o: Partial<Foo1>,
1000+
>o : Symbol(o, Decl(correlatedUnions.ts, 294, 48))
1001+
>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
1002+
>Foo1 : Symbol(Foo1, Decl(correlatedUnions.ts, 285, 1))
1003+
1004+
k: K
1005+
>k : Symbol(k, Decl(correlatedUnions.ts, 295, 19))
1006+
>K : Symbol(K, Decl(correlatedUnions.ts, 294, 26))
1007+
1008+
): Foo1[K] | undefined {
1009+
>Foo1 : Symbol(Foo1, Decl(correlatedUnions.ts, 285, 1))
1010+
>K : Symbol(K, Decl(correlatedUnions.ts, 294, 26))
1011+
1012+
return o[k];
1013+
>o : Symbol(o, Decl(correlatedUnions.ts, 294, 48))
1014+
>k : Symbol(k, Decl(correlatedUnions.ts, 295, 19))
1015+
}
1016+

tests/baselines/reference/correlatedUnions.types

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,3 +828,73 @@ const getStringAndNumberFromOriginalAndMapped = <
828828
>nestedKey : N
829829

830830
};
831+
832+
// repro from #31675
833+
interface Config {
834+
string: string;
835+
>string : string
836+
837+
number: number;
838+
>number : number
839+
}
840+
841+
function getConfigOrDefault<T extends keyof Config>(
842+
>getConfigOrDefault : <T extends keyof Config>(userConfig: Partial<Config>, key: T, defaultValue: Config[T]) => Config[T]
843+
844+
userConfig: Partial<Config>,
845+
>userConfig : Partial<Config>
846+
847+
key: T,
848+
>key : T
849+
850+
defaultValue: Config[T]
851+
>defaultValue : Config[T]
852+
853+
): Config[T] {
854+
const userValue = userConfig[key];
855+
>userValue : Partial<Config>[T]
856+
>userConfig[key] : Partial<Config>[T]
857+
>userConfig : Partial<Config>
858+
>key : T
859+
860+
const assertedCheck = userValue ? userValue! : defaultValue;
861+
>assertedCheck : Config[T]
862+
>userValue ? userValue! : defaultValue : Config[T]
863+
>userValue : Partial<Config>[T]
864+
>userValue! : NonNullable<Partial<Config>[T]>
865+
>userValue : NonNullable<Partial<Config>[T]>
866+
>defaultValue : Config[T]
867+
868+
return assertedCheck;
869+
>assertedCheck : Config[T]
870+
}
871+
872+
// repro from #47523
873+
874+
type Foo1 = {
875+
>Foo1 : { x: number; y: string; }
876+
877+
x: number;
878+
>x : number
879+
880+
y: string;
881+
>y : string
882+
883+
};
884+
885+
function getValueConcrete<K extends keyof Foo1>(
886+
>getValueConcrete : <K extends keyof Foo1>(o: Partial<Foo1>, k: K) => Foo1[K] | undefined
887+
888+
o: Partial<Foo1>,
889+
>o : Partial<Foo1>
890+
891+
k: K
892+
>k : K
893+
894+
): Foo1[K] | undefined {
895+
return o[k];
896+
>o[k] : Partial<Foo1>[K]
897+
>o : Partial<Foo1>
898+
>k : K
899+
}
900+

tests/cases/compiler/correlatedUnions.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,4 +270,34 @@ const getStringAndNumberFromOriginalAndMapped = <
270270
nestedKey: N
271271
): [Original[K][N], MappedFromOriginal[K][N]] => {
272272
return [original[key][nestedKey], mappedFromOriginal[key][nestedKey]];
273-
};
273+
};
274+
275+
// repro from #31675
276+
interface Config {
277+
string: string;
278+
number: number;
279+
}
280+
281+
function getConfigOrDefault<T extends keyof Config>(
282+
userConfig: Partial<Config>,
283+
key: T,
284+
defaultValue: Config[T]
285+
): Config[T] {
286+
const userValue = userConfig[key];
287+
const assertedCheck = userValue ? userValue! : defaultValue;
288+
return assertedCheck;
289+
}
290+
291+
// repro from #47523
292+
293+
type Foo1 = {
294+
x: number;
295+
y: string;
296+
};
297+
298+
function getValueConcrete<K extends keyof Foo1>(
299+
o: Partial<Foo1>,
300+
k: K
301+
): Foo1[K] | undefined {
302+
return o[k];
303+
}

0 commit comments

Comments
 (0)