@@ -890,11 +890,11 @@ function f60<T>(source: T, target: T) {
890890}
891891
892892function f70(func: <T, U>(k1: keyof (T | U), k2: keyof (T & U)) => void) {
893- >f70 : (func: <T, U>(k1: keyof (T | U) , k2: keyof T | keyof U) => void) => void
894- >func : <T, U>(k1: keyof (T | U) , k2: keyof T | keyof U) => void
893+ >f70 : (func: <T, U>(k1: keyof T & keyof U , k2: keyof T | keyof U) => void) => void
894+ >func : <T, U>(k1: keyof T & keyof U , k2: keyof T | keyof U) => void
895895>T : T
896896>U : U
897- >k1 : keyof (T | U)
897+ >k1 : keyof T & keyof U
898898>T : T
899899>U : U
900900>k2 : keyof T | keyof U
@@ -903,7 +903,7 @@ function f70(func: <T, U>(k1: keyof (T | U), k2: keyof (T & U)) => void) {
903903
904904 func<{ a: any, b: any }, { a: any, c: any }>('a', 'a');
905905>func<{ a: any, b: any }, { a: any, c: any }>('a', 'a') : void
906- >func : <T, U>(k1: keyof (T | U) , k2: keyof T | keyof U) => void
906+ >func : <T, U>(k1: keyof T & keyof U , k2: keyof T | keyof U) => void
907907>a : any
908908>b : any
909909>a : any
@@ -913,7 +913,7 @@ function f70(func: <T, U>(k1: keyof (T | U), k2: keyof (T & U)) => void) {
913913
914914 func<{ a: any, b: any }, { a: any, c: any }>('a', 'b');
915915>func<{ a: any, b: any }, { a: any, c: any }>('a', 'b') : void
916- >func : <T, U>(k1: keyof (T | U) , k2: keyof T | keyof U) => void
916+ >func : <T, U>(k1: keyof T & keyof U , k2: keyof T | keyof U) => void
917917>a : any
918918>b : any
919919>a : any
@@ -923,7 +923,7 @@ function f70(func: <T, U>(k1: keyof (T | U), k2: keyof (T & U)) => void) {
923923
924924 func<{ a: any, b: any }, { a: any, c: any }>('a', 'c');
925925>func<{ a: any, b: any }, { a: any, c: any }>('a', 'c') : void
926- >func : <T, U>(k1: keyof (T | U) , k2: keyof T | keyof U) => void
926+ >func : <T, U>(k1: keyof T & keyof U , k2: keyof T | keyof U) => void
927927>a : any
928928>b : any
929929>a : any
@@ -1097,8 +1097,8 @@ function f73(func: <T, U, K extends keyof (T & U)>(x: T, y: U, k: K) => (T & U)[
10971097}
10981098
10991099function f74(func: <T, U, K extends keyof (T | U)>(x: T, y: U, k: K) => (T | U)[K]) {
1100- >f74 : (func: <T, U, K extends keyof (T | U) >(x: T, y: U, k: K) => (T | U)[K]) => void
1101- >func : <T, U, K extends keyof (T | U) >(x: T, y: U, k: K) => (T | U)[K]
1100+ >f74 : (func: <T, U, K extends keyof T & keyof U >(x: T, y: U, k: K) => (T | U)[K]) => void
1101+ >func : <T, U, K extends keyof T & keyof U >(x: T, y: U, k: K) => (T | U)[K]
11021102>T : T
11031103>U : U
11041104>K : K
@@ -1117,7 +1117,7 @@ function f74(func: <T, U, K extends keyof (T | U)>(x: T, y: U, k: K) => (T | U)[
11171117 let a = func({ a: 1, b: "hello" }, { a: 2, b: true }, 'a'); // number
11181118>a : number
11191119>func({ a: 1, b: "hello" }, { a: 2, b: true }, 'a') : number
1120- >func : <T, U, K extends keyof (T | U) >(x: T, y: U, k: K) => (T | U)[K]
1120+ >func : <T, U, K extends keyof T & keyof U >(x: T, y: U, k: K) => (T | U)[K]
11211121>{ a: 1, b: "hello" } : { a: number; b: string; }
11221122>a : number
11231123>1 : 1
@@ -1133,7 +1133,7 @@ function f74(func: <T, U, K extends keyof (T | U)>(x: T, y: U, k: K) => (T | U)[
11331133 let b = func({ a: 1, b: "hello" }, { a: 2, b: true }, 'b'); // string | boolean
11341134>b : string | boolean
11351135>func({ a: 1, b: "hello" }, { a: 2, b: true }, 'b') : string | boolean
1136- >func : <T, U, K extends keyof (T | U) >(x: T, y: U, k: K) => (T | U)[K]
1136+ >func : <T, U, K extends keyof T & keyof U >(x: T, y: U, k: K) => (T | U)[K]
11371137>{ a: 1, b: "hello" } : { a: number; b: string; }
11381138>a : number
11391139>1 : 1
@@ -2345,3 +2345,72 @@ type Predicates<TaggedRecord> = {
23452345>T : T
23462346}
23472347
2348+ // Repro from #23618
2349+
2350+ type DBBoolTable<K extends string> = { [k in K]: 0 | 1 }
2351+ >DBBoolTable : DBBoolTable<K>
2352+ >K : K
2353+ >k : k
2354+ >K : K
2355+
2356+ enum Flag {
2357+ >Flag : Flag
2358+
2359+ FLAG_1 = "flag_1",
2360+ >FLAG_1 : Flag.FLAG_1
2361+ >"flag_1" : "flag_1"
2362+
2363+ FLAG_2 = "flag_2"
2364+ >FLAG_2 : Flag.FLAG_2
2365+ >"flag_2" : "flag_2"
2366+ }
2367+
2368+ type SimpleDBRecord<Flag extends string> = { staticField: number } & DBBoolTable<Flag>
2369+ >SimpleDBRecord : SimpleDBRecord<Flag>
2370+ >Flag : Flag
2371+ >staticField : number
2372+ >DBBoolTable : DBBoolTable<K>
2373+ >Flag : Flag
2374+
2375+ function getFlagsFromSimpleRecord<Flag extends string>(record: SimpleDBRecord<Flag>, flags: Flag[]) {
2376+ >getFlagsFromSimpleRecord : <Flag extends string>(record: SimpleDBRecord<Flag>, flags: Flag[]) => SimpleDBRecord<Flag>[Flag]
2377+ >Flag : Flag
2378+ >record : SimpleDBRecord<Flag>
2379+ >SimpleDBRecord : SimpleDBRecord<Flag>
2380+ >Flag : Flag
2381+ >flags : Flag[]
2382+ >Flag : Flag
2383+
2384+ return record[flags[0]];
2385+ >record[flags[0]] : SimpleDBRecord<Flag>[Flag]
2386+ >record : SimpleDBRecord<Flag>
2387+ >flags[0] : Flag
2388+ >flags : Flag[]
2389+ >0 : 0
2390+ }
2391+
2392+ type DynamicDBRecord<Flag extends string> = ({ dynamicField: number } | { dynamicField: string }) & DBBoolTable<Flag>
2393+ >DynamicDBRecord : DynamicDBRecord<Flag>
2394+ >Flag : Flag
2395+ >dynamicField : number
2396+ >dynamicField : string
2397+ >DBBoolTable : DBBoolTable<K>
2398+ >Flag : Flag
2399+
2400+ function getFlagsFromDynamicRecord<Flag extends string>(record: DynamicDBRecord<Flag>, flags: Flag[]) {
2401+ >getFlagsFromDynamicRecord : <Flag extends string>(record: DynamicDBRecord<Flag>, flags: Flag[]) => DynamicDBRecord<Flag>[Flag]
2402+ >Flag : Flag
2403+ >record : DynamicDBRecord<Flag>
2404+ >DynamicDBRecord : DynamicDBRecord<Flag>
2405+ >Flag : Flag
2406+ >flags : Flag[]
2407+ >Flag : Flag
2408+
2409+ return record[flags[0]];
2410+ >record[flags[0]] : DynamicDBRecord<Flag>[Flag]
2411+ >record : DynamicDBRecord<Flag>
2412+ >flags[0] : Flag
2413+ >flags : Flag[]
2414+ >0 : 0
2415+ }
2416+
0 commit comments