Created
May 22, 2019 18:17
-
-
Save weswigham/1d0564caf845f0c27c8314855dbd52aa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| interface Obj<T> { | |
| ref: T; | |
| } | |
| interface Func<T> { | |
| (x: T): void; | |
| } | |
| type CtorOf<T> = T extends unknown ? (x: T) => T : never; | |
| interface Big { | |
| "0": { common?: string; "0"?: number, ref?: Obj<Big["0"]> | Func<Big["0"]>; } | |
| "1": { common?: string; "1"?: number, ref?: Obj<Big["1"]> | Func<Big["1"]>; } | |
| "2": { common?: string; "2"?: number, ref?: Obj<Big["2"]> | Func<Big["2"]>; } | |
| "3": { common?: string; "3"?: number, ref?: Obj<Big["3"]> | Func<Big["3"]>; } | |
| "4": { common?: string; "4"?: number, ref?: Obj<Big["4"]> | Func<Big["4"]>; } | |
| "5": { common?: string; "5"?: number, ref?: Obj<Big["5"]> | Func<Big["5"]>; } | |
| "6": { common?: string; "6"?: number, ref?: Obj<Big["6"]> | Func<Big["6"]>; } | |
| "7": { common?: string; "7"?: number, ref?: Obj<Big["7"]> | Func<Big["7"]>; } | |
| "8": { common?: string; "8"?: number, ref?: Obj<Big["8"]> | Func<Big["8"]>; } | |
| "9": { common?: string; "9"?: number, ref?: Obj<Big["9"]> | Func<Big["9"]>; } | |
| "10": { common?: string; "10"?: number, ref?: Obj<Big["10"]> | Func<Big["10"]>; } | |
| "11": { common?: string; "11"?: number, ref?: Obj<Big["11"]> | Func<Big["11"]>; } | |
| "12": { common?: string; "12"?: number, ref?: Obj<Big["12"]> | Func<Big["12"]>; } | |
| "13": { common?: string; "13"?: number, ref?: Obj<Big["13"]> | Func<Big["13"]>; } | |
| "14": { common?: string; "14"?: number, ref?: Obj<Big["14"]> | Func<Big["14"]>; } | |
| "15": { common?: string; "15"?: number, ref?: Obj<Big["15"]> | Func<Big["15"]>; } | |
| "16": { common?: string; "16"?: number, ref?: Obj<Big["16"]> | Func<Big["16"]>; } | |
| "17": { common?: string; "17"?: number, ref?: Obj<Big["17"]> | Func<Big["17"]>; } | |
| "18": { common?: string; "18"?: number, ref?: Obj<Big["18"]> | Func<Big["18"]>; } | |
| "19": { common?: string; "19"?: number, ref?: Obj<Big["19"]> | Func<Big["19"]>; } | |
| "20": { common?: string; "20"?: number, ref?: Obj<Big["20"]> | Func<Big["20"]>; } | |
| "21": { common?: string; "21"?: number, ref?: Obj<Big["21"]> | Func<Big["21"]>; } | |
| "22": { common?: string; "22"?: number, ref?: Obj<Big["22"]> | Func<Big["22"]>; } | |
| "23": { common?: string; "23"?: number, ref?: Obj<Big["23"]> | Func<Big["23"]>; } | |
| "24": { common?: string; "24"?: number, ref?: Obj<Big["24"]> | Func<Big["24"]>; } | |
| "25": { common?: string; "25"?: number, ref?: Obj<Big["25"]> | Func<Big["25"]>; } | |
| "26": { common?: string; "26"?: number, ref?: Obj<Big["26"]> | Func<Big["26"]>; } | |
| "27": { common?: string; "27"?: number, ref?: Obj<Big["27"]> | Func<Big["27"]>; } | |
| "28": { common?: string; "28"?: number, ref?: Obj<Big["28"]> | Func<Big["28"]>; } | |
| "29": { common?: string; "29"?: number, ref?: Obj<Big["29"]> | Func<Big["29"]>; } | |
| "30": { common?: string; "30"?: number, ref?: Obj<Big["30"]> | Func<Big["30"]>; } | |
| "31": { common?: string; "31"?: number, ref?: Obj<Big["31"]> | Func<Big["31"]>; } | |
| "32": { common?: string; "32"?: number, ref?: Obj<Big["32"]> | Func<Big["32"]>; } | |
| "33": { common?: string; "33"?: number, ref?: Obj<Big["33"]> | Func<Big["33"]>; } | |
| "34": { common?: string; "34"?: number, ref?: Obj<Big["34"]> | Func<Big["34"]>; } | |
| "35": { common?: string; "35"?: number, ref?: Obj<Big["35"]> | Func<Big["35"]>; } | |
| "36": { common?: string; "36"?: number, ref?: Obj<Big["36"]> | Func<Big["36"]>; } | |
| "37": { common?: string; "37"?: number, ref?: Obj<Big["37"]> | Func<Big["37"]>; } | |
| "38": { common?: string; "38"?: number, ref?: Obj<Big["38"]> | Func<Big["38"]>; } | |
| "39": { common?: string; "39"?: number, ref?: Obj<Big["39"]> | Func<Big["39"]>; } | |
| "40": { common?: string; "40"?: number, ref?: Obj<Big["40"]> | Func<Big["40"]>; } | |
| "41": { common?: string; "41"?: number, ref?: Obj<Big["41"]> | Func<Big["41"]>; } | |
| "42": { common?: string; "42"?: number, ref?: Obj<Big["42"]> | Func<Big["42"]>; } | |
| "43": { common?: string; "43"?: number, ref?: Obj<Big["43"]> | Func<Big["43"]>; } | |
| "44": { common?: string; "44"?: number, ref?: Obj<Big["44"]> | Func<Big["44"]>; } | |
| "45": { common?: string; "45"?: number, ref?: Obj<Big["45"]> | Func<Big["45"]>; } | |
| "46": { common?: string; "46"?: number, ref?: Obj<Big["46"]> | Func<Big["46"]>; } | |
| "47": { common?: string; "47"?: number, ref?: Obj<Big["47"]> | Func<Big["47"]>; } | |
| "48": { common?: string; "48"?: number, ref?: Obj<Big["48"]> | Func<Big["48"]>; } | |
| "49": { common?: string; "49"?: number, ref?: Obj<Big["49"]> | Func<Big["49"]>; } | |
| "50": { common?: string; "50"?: number, ref?: Obj<Big["50"]> | Func<Big["50"]>; } | |
| "51": { common?: string; "51"?: number, ref?: Obj<Big["51"]> | Func<Big["51"]>; } | |
| "52": { common?: string; "52"?: number, ref?: Obj<Big["52"]> | Func<Big["52"]>; } | |
| "53": { common?: string; "53"?: number, ref?: Obj<Big["53"]> | Func<Big["53"]>; } | |
| "54": { common?: string; "54"?: number, ref?: Obj<Big["54"]> | Func<Big["54"]>; } | |
| "55": { common?: string; "55"?: number, ref?: Obj<Big["55"]> | Func<Big["55"]>; } | |
| "56": { common?: string; "56"?: number, ref?: Obj<Big["56"]> | Func<Big["56"]>; } | |
| "57": { common?: string; "57"?: number, ref?: Obj<Big["57"]> | Func<Big["57"]>; } | |
| "58": { common?: string; "58"?: number, ref?: Obj<Big["58"]> | Func<Big["58"]>; } | |
| "59": { common?: string; "59"?: number, ref?: Obj<Big["59"]> | Func<Big["59"]>; } | |
| "60": { common?: string; "60"?: number, ref?: Obj<Big["60"]> | Func<Big["60"]>; } | |
| "61": { common?: string; "61"?: number, ref?: Obj<Big["61"]> | Func<Big["61"]>; } | |
| "62": { common?: string; "62"?: number, ref?: Obj<Big["62"]> | Func<Big["62"]>; } | |
| "63": { common?: string; "63"?: number, ref?: Obj<Big["63"]> | Func<Big["63"]>; } | |
| "64": { common?: string; "64"?: number, ref?: Obj<Big["64"]> | Func<Big["64"]>; } | |
| "65": { common?: string; "65"?: number, ref?: Obj<Big["65"]> | Func<Big["65"]>; } | |
| "66": { common?: string; "66"?: number, ref?: Obj<Big["66"]> | Func<Big["66"]>; } | |
| "67": { common?: string; "67"?: number, ref?: Obj<Big["67"]> | Func<Big["67"]>; } | |
| "68": { common?: string; "68"?: number, ref?: Obj<Big["68"]> | Func<Big["68"]>; } | |
| "69": { common?: string; "69"?: number, ref?: Obj<Big["69"]> | Func<Big["69"]>; } | |
| "70": { common?: string; "70"?: number, ref?: Obj<Big["70"]> | Func<Big["70"]>; } | |
| "71": { common?: string; "71"?: number, ref?: Obj<Big["71"]> | Func<Big["71"]>; } | |
| "72": { common?: string; "72"?: number, ref?: Obj<Big["72"]> | Func<Big["72"]>; } | |
| "73": { common?: string; "73"?: number, ref?: Obj<Big["73"]> | Func<Big["73"]>; } | |
| "74": { common?: string; "74"?: number, ref?: Obj<Big["74"]> | Func<Big["74"]>; } | |
| "75": { common?: string; "75"?: number, ref?: Obj<Big["75"]> | Func<Big["75"]>; } | |
| "76": { common?: string; "76"?: number, ref?: Obj<Big["76"]> | Func<Big["76"]>; } | |
| "77": { common?: string; "77"?: number, ref?: Obj<Big["77"]> | Func<Big["77"]>; } | |
| "78": { common?: string; "78"?: number, ref?: Obj<Big["78"]> | Func<Big["78"]>; } | |
| "79": { common?: string; "79"?: number, ref?: Obj<Big["79"]> | Func<Big["79"]>; } | |
| "80": { common?: string; "80"?: number, ref?: Obj<Big["80"]> | Func<Big["80"]>; } | |
| "81": { common?: string; "81"?: number, ref?: Obj<Big["81"]> | Func<Big["81"]>; } | |
| "82": { common?: string; "82"?: number, ref?: Obj<Big["82"]> | Func<Big["82"]>; } | |
| "83": { common?: string; "83"?: number, ref?: Obj<Big["83"]> | Func<Big["83"]>; } | |
| "84": { common?: string; "84"?: number, ref?: Obj<Big["84"]> | Func<Big["84"]>; } | |
| "85": { common?: string; "85"?: number, ref?: Obj<Big["85"]> | Func<Big["85"]>; } | |
| "86": { common?: string; "86"?: number, ref?: Obj<Big["86"]> | Func<Big["86"]>; } | |
| "87": { common?: string; "87"?: number, ref?: Obj<Big["87"]> | Func<Big["87"]>; } | |
| "88": { common?: string; "88"?: number, ref?: Obj<Big["88"]> | Func<Big["88"]>; } | |
| "89": { common?: string; "89"?: number, ref?: Obj<Big["89"]> | Func<Big["89"]>; } | |
| "90": { common?: string; "90"?: number, ref?: Obj<Big["90"]> | Func<Big["90"]>; } | |
| "91": { common?: string; "91"?: number, ref?: Obj<Big["91"]> | Func<Big["91"]>; } | |
| "92": { common?: string; "92"?: number, ref?: Obj<Big["92"]> | Func<Big["92"]>; } | |
| "93": { common?: string; "93"?: number, ref?: Obj<Big["93"]> | Func<Big["93"]>; } | |
| "94": { common?: string; "94"?: number, ref?: Obj<Big["94"]> | Func<Big["94"]>; } | |
| "95": { common?: string; "95"?: number, ref?: Obj<Big["95"]> | Func<Big["95"]>; } | |
| "96": { common?: string; "96"?: number, ref?: Obj<Big["96"]> | Func<Big["96"]>; } | |
| "97": { common?: string; "97"?: number, ref?: Obj<Big["97"]> | Func<Big["97"]>; } | |
| "98": { common?: string; "98"?: number, ref?: Obj<Big["98"]> | Func<Big["98"]>; } | |
| "99": { common?: string; "99"?: number, ref?: Obj<Big["99"]> | Func<Big["99"]>; } | |
| "100": { common?: string; "100"?: number, ref?: Obj<Big["100"]> | Func<Big["100"]>; } | |
| "101": { common?: string; "101"?: number, ref?: Obj<Big["101"]> | Func<Big["101"]>; } | |
| "102": { common?: string; "102"?: number, ref?: Obj<Big["102"]> | Func<Big["102"]>; } | |
| "103": { common?: string; "103"?: number, ref?: Obj<Big["103"]> | Func<Big["103"]>; } | |
| "104": { common?: string; "104"?: number, ref?: Obj<Big["104"]> | Func<Big["104"]>; } | |
| "105": { common?: string; "105"?: number, ref?: Obj<Big["105"]> | Func<Big["105"]>; } | |
| "106": { common?: string; "106"?: number, ref?: Obj<Big["106"]> | Func<Big["106"]>; } | |
| "107": { common?: string; "107"?: number, ref?: Obj<Big["107"]> | Func<Big["107"]>; } | |
| "108": { common?: string; "108"?: number, ref?: Obj<Big["108"]> | Func<Big["108"]>; } | |
| "109": { common?: string; "109"?: number, ref?: Obj<Big["109"]> | Func<Big["109"]>; } | |
| } | |
| declare function getCtor<T extends keyof Big>(comp: T): CtorOf<Big[T]>; | |
| declare var all: keyof Big; | |
| const ctor = getCtor(all); | |
| const comp = ctor({ common: "ok", ref: x => console.log(x) }); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment