Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // ref: https://github.com/ahejlsberg/tsconf2020-demos/blob/master/template/main.ts#L108 type SubKeys<T, K extends string | number> = K extends keyof T ? `${K}.${DotPath<T[K]>}` : never export type DotPath<T> = object extends T ? string : T extends any[] ? '0' | SubKeys<T, 0> : T extends readonly any[] ? Extract<keyof T, `${number}`> | SubKeys<T, Extract<keyof T, `${number}`>> : T extends object ? Extract<keyof T, string> | SubKeys<T, Extract<keyof T, string>> : never export type DotPathValue<T, Path extends string> = Path extends '0' ? // @ts-ignore T[0] : Path extends keyof T ? T[Path] : Path extends `${infer K}.${infer R}` ? K extends '0' ? DotPathValue< // @ts-ignore T[0], R > : K extends keyof T ? DotPathValue<T[K], R> : unknown : unknown export type DotPathWithRoot<T> = DotPath<T> | '.' export type DotPathWithRootValue<T, Path extends string> = Path extends '.' ? T : DotPathValue<T, Path> |