1// @strict: true 2 3// Repro from #30050 4 5interface Obj<T> { 6 ref: T; 7} 8interface Func<T> { 9 (x: T): void; 10} 11type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; 12type CtorOf<T> = (arg: UnionToIntersection<T>) => T; 13 14interface Big { 15 "0": { common?: string; "0"?: number, ref?: Obj<Big["0"]> | Func<Big["0"]>; } 16 "1": { common?: string; "1"?: number, ref?: Obj<Big["1"]> | Func<Big["1"]>; } 17 "2": { common?: string; "2"?: number, ref?: Obj<Big["2"]> | Func<Big["2"]>; } 18 "3": { common?: string; "3"?: number, ref?: Obj<Big["3"]> | Func<Big["3"]>; } 19 "4": { common?: string; "4"?: number, ref?: Obj<Big["4"]> | Func<Big["4"]>; } 20 "5": { common?: string; "5"?: number, ref?: Obj<Big["5"]> | Func<Big["5"]>; } 21 "6": { common?: string; "6"?: number, ref?: Obj<Big["6"]> | Func<Big["6"]>; } 22 "7": { common?: string; "7"?: number, ref?: Obj<Big["7"]> | Func<Big["7"]>; } 23 "8": { common?: string; "8"?: number, ref?: Obj<Big["8"]> | Func<Big["8"]>; } 24 "9": { common?: string; "9"?: number, ref?: Obj<Big["9"]> | Func<Big["9"]>; } 25 "10": { common?: string; "10"?: number, ref?: Obj<Big["10"]> | Func<Big["10"]>; } 26 "11": { common?: string; "11"?: number, ref?: Obj<Big["11"]> | Func<Big["11"]>; } 27 "12": { common?: string; "12"?: number, ref?: Obj<Big["12"]> | Func<Big["12"]>; } 28 "13": { common?: string; "13"?: number, ref?: Obj<Big["13"]> | Func<Big["13"]>; } 29 "14": { common?: string; "14"?: number, ref?: Obj<Big["14"]> | Func<Big["14"]>; } 30 "15": { common?: string; "15"?: number, ref?: Obj<Big["15"]> | Func<Big["15"]>; } 31 "16": { common?: string; "16"?: number, ref?: Obj<Big["16"]> | Func<Big["16"]>; } 32 "17": { common?: string; "17"?: number, ref?: Obj<Big["17"]> | Func<Big["17"]>; } 33} 34declare function getCtor<T extends keyof Big>(comp: T): CtorOf<Big[T]> 35 36declare var all: keyof Big; 37const ctor = getCtor(all); 38const comp = ctor({ common: "ok", ref: x => console.log(x) }); 39