Skip to content

Commit 2953bcd

Browse files
authored
Add an extra test case for mapped type relationships (#53232)
1 parent 5a4d5e1 commit 2953bcd

File tree

5 files changed

+163
-2
lines changed

5 files changed

+163
-2
lines changed

tests/baselines/reference/mappedTypeRelationships.errors.txt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,4 +372,21 @@ tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(168,5): error TS
372372
function f<T extends { x: {} }>(): Partial<T> {
373373
return undefined! as T;
374374
}
375-
375+
376+
// #32365
377+
interface SettingsTypes {
378+
audio: {
379+
volume: string;
380+
};
381+
video: {
382+
resolution: string;
383+
};
384+
}
385+
interface Settings<Params extends { [K in keyof Params]?: string }> {
386+
config: Params;
387+
}
388+
type ConcreteSettingsResult1 = Settings<SettingsTypes["audio"]>;
389+
type ConcreteSettingsResult2 = Settings<SettingsTypes["audio" | "video"]>;
390+
type GenericSettingsAccess<T extends keyof SettingsTypes> = Settings<SettingsTypes[T]>;
391+
type GenericSettingsResult1 = GenericSettingsAccess<"audio">;
392+
type GenericSettingsResult2 = GenericSettingsAccess<"audio" | "video">;

tests/baselines/reference/mappedTypeRelationships.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,24 @@ function f90<T extends { x: number }>() {
190190
function f<T extends { x: {} }>(): Partial<T> {
191191
return undefined! as T;
192192
}
193-
193+
194+
// #32365
195+
interface SettingsTypes {
196+
audio: {
197+
volume: string;
198+
};
199+
video: {
200+
resolution: string;
201+
};
202+
}
203+
interface Settings<Params extends { [K in keyof Params]?: string }> {
204+
config: Params;
205+
}
206+
type ConcreteSettingsResult1 = Settings<SettingsTypes["audio"]>;
207+
type ConcreteSettingsResult2 = Settings<SettingsTypes["audio" | "video"]>;
208+
type GenericSettingsAccess<T extends keyof SettingsTypes> = Settings<SettingsTypes[T]>;
209+
type GenericSettingsResult1 = GenericSettingsAccess<"audio">;
210+
type GenericSettingsResult2 = GenericSettingsAccess<"audio" | "video">;
194211

195212
//// [mappedTypeRelationships.js]
196213
function f1(x, k) {
@@ -418,3 +435,21 @@ declare function f90<T extends {
418435
declare function f<T extends {
419436
x: {};
420437
}>(): Partial<T>;
438+
interface SettingsTypes {
439+
audio: {
440+
volume: string;
441+
};
442+
video: {
443+
resolution: string;
444+
};
445+
}
446+
interface Settings<Params extends {
447+
[K in keyof Params]?: string;
448+
}> {
449+
config: Params;
450+
}
451+
type ConcreteSettingsResult1 = Settings<SettingsTypes["audio"]>;
452+
type ConcreteSettingsResult2 = Settings<SettingsTypes["audio" | "video"]>;
453+
type GenericSettingsAccess<T extends keyof SettingsTypes> = Settings<SettingsTypes[T]>;
454+
type GenericSettingsResult1 = GenericSettingsAccess<"audio">;
455+
type GenericSettingsResult2 = GenericSettingsAccess<"audio" | "video">;

tests/baselines/reference/mappedTypeRelationships.symbols

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,3 +836,58 @@ function f<T extends { x: {} }>(): Partial<T> {
836836
>T : Symbol(T, Decl(mappedTypeRelationships.ts, 188, 11))
837837
}
838838

839+
// #32365
840+
interface SettingsTypes {
841+
>SettingsTypes : Symbol(SettingsTypes, Decl(mappedTypeRelationships.ts, 190, 1))
842+
843+
audio: {
844+
>audio : Symbol(SettingsTypes.audio, Decl(mappedTypeRelationships.ts, 193, 25))
845+
846+
volume: string;
847+
>volume : Symbol(volume, Decl(mappedTypeRelationships.ts, 194, 10))
848+
849+
};
850+
video: {
851+
>video : Symbol(SettingsTypes.video, Decl(mappedTypeRelationships.ts, 196, 4))
852+
853+
resolution: string;
854+
>resolution : Symbol(resolution, Decl(mappedTypeRelationships.ts, 197, 10))
855+
856+
};
857+
}
858+
interface Settings<Params extends { [K in keyof Params]?: string }> {
859+
>Settings : Symbol(Settings, Decl(mappedTypeRelationships.ts, 200, 1))
860+
>Params : Symbol(Params, Decl(mappedTypeRelationships.ts, 201, 19))
861+
>K : Symbol(K, Decl(mappedTypeRelationships.ts, 201, 37))
862+
>Params : Symbol(Params, Decl(mappedTypeRelationships.ts, 201, 19))
863+
864+
config: Params;
865+
>config : Symbol(Settings.config, Decl(mappedTypeRelationships.ts, 201, 69))
866+
>Params : Symbol(Params, Decl(mappedTypeRelationships.ts, 201, 19))
867+
}
868+
type ConcreteSettingsResult1 = Settings<SettingsTypes["audio"]>;
869+
>ConcreteSettingsResult1 : Symbol(ConcreteSettingsResult1, Decl(mappedTypeRelationships.ts, 203, 1))
870+
>Settings : Symbol(Settings, Decl(mappedTypeRelationships.ts, 200, 1))
871+
>SettingsTypes : Symbol(SettingsTypes, Decl(mappedTypeRelationships.ts, 190, 1))
872+
873+
type ConcreteSettingsResult2 = Settings<SettingsTypes["audio" | "video"]>;
874+
>ConcreteSettingsResult2 : Symbol(ConcreteSettingsResult2, Decl(mappedTypeRelationships.ts, 204, 64))
875+
>Settings : Symbol(Settings, Decl(mappedTypeRelationships.ts, 200, 1))
876+
>SettingsTypes : Symbol(SettingsTypes, Decl(mappedTypeRelationships.ts, 190, 1))
877+
878+
type GenericSettingsAccess<T extends keyof SettingsTypes> = Settings<SettingsTypes[T]>;
879+
>GenericSettingsAccess : Symbol(GenericSettingsAccess, Decl(mappedTypeRelationships.ts, 205, 74))
880+
>T : Symbol(T, Decl(mappedTypeRelationships.ts, 206, 27))
881+
>SettingsTypes : Symbol(SettingsTypes, Decl(mappedTypeRelationships.ts, 190, 1))
882+
>Settings : Symbol(Settings, Decl(mappedTypeRelationships.ts, 200, 1))
883+
>SettingsTypes : Symbol(SettingsTypes, Decl(mappedTypeRelationships.ts, 190, 1))
884+
>T : Symbol(T, Decl(mappedTypeRelationships.ts, 206, 27))
885+
886+
type GenericSettingsResult1 = GenericSettingsAccess<"audio">;
887+
>GenericSettingsResult1 : Symbol(GenericSettingsResult1, Decl(mappedTypeRelationships.ts, 206, 87))
888+
>GenericSettingsAccess : Symbol(GenericSettingsAccess, Decl(mappedTypeRelationships.ts, 205, 74))
889+
890+
type GenericSettingsResult2 = GenericSettingsAccess<"audio" | "video">;
891+
>GenericSettingsResult2 : Symbol(GenericSettingsResult2, Decl(mappedTypeRelationships.ts, 207, 61))
892+
>GenericSettingsAccess : Symbol(GenericSettingsAccess, Decl(mappedTypeRelationships.ts, 205, 74))
893+

tests/baselines/reference/mappedTypeRelationships.types

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,3 +678,39 @@ function f<T extends { x: {} }>(): Partial<T> {
678678
>undefined : undefined
679679
}
680680

681+
// #32365
682+
interface SettingsTypes {
683+
audio: {
684+
>audio : { volume: string; }
685+
686+
volume: string;
687+
>volume : string
688+
689+
};
690+
video: {
691+
>video : { resolution: string; }
692+
693+
resolution: string;
694+
>resolution : string
695+
696+
};
697+
}
698+
interface Settings<Params extends { [K in keyof Params]?: string }> {
699+
config: Params;
700+
>config : Params
701+
}
702+
type ConcreteSettingsResult1 = Settings<SettingsTypes["audio"]>;
703+
>ConcreteSettingsResult1 : Settings<{ volume: string; }>
704+
705+
type ConcreteSettingsResult2 = Settings<SettingsTypes["audio" | "video"]>;
706+
>ConcreteSettingsResult2 : Settings<{ volume: string; } | { resolution: string; }>
707+
708+
type GenericSettingsAccess<T extends keyof SettingsTypes> = Settings<SettingsTypes[T]>;
709+
>GenericSettingsAccess : GenericSettingsAccess<T>
710+
711+
type GenericSettingsResult1 = GenericSettingsAccess<"audio">;
712+
>GenericSettingsResult1 : Settings<{ volume: string; }>
713+
714+
type GenericSettingsResult2 = GenericSettingsAccess<"audio" | "video">;
715+
>GenericSettingsResult2 : Settings<{ volume: string; } | { resolution: string; }>
716+

tests/cases/conformance/types/mapped/mappedTypeRelationships.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,21 @@ function f90<T extends { x: number }>() {
192192
function f<T extends { x: {} }>(): Partial<T> {
193193
return undefined! as T;
194194
}
195+
196+
// #32365
197+
interface SettingsTypes {
198+
audio: {
199+
volume: string;
200+
};
201+
video: {
202+
resolution: string;
203+
};
204+
}
205+
interface Settings<Params extends { [K in keyof Params]?: string }> {
206+
config: Params;
207+
}
208+
type ConcreteSettingsResult1 = Settings<SettingsTypes["audio"]>;
209+
type ConcreteSettingsResult2 = Settings<SettingsTypes["audio" | "video"]>;
210+
type GenericSettingsAccess<T extends keyof SettingsTypes> = Settings<SettingsTypes[T]>;
211+
type GenericSettingsResult1 = GenericSettingsAccess<"audio">;
212+
type GenericSettingsResult2 = GenericSettingsAccess<"audio" | "video">;

0 commit comments

Comments
 (0)