From a6a4d76de9538f1518702e2d9d14b6f1612d9684 Mon Sep 17 00:00:00 2001 From: MrSpoony Date: Thu, 9 Mar 2023 10:54:17 +0100 Subject: [PATCH] add tree path array --- tree-path-array.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tree-path-array.ts diff --git a/tree-path-array.ts b/tree-path-array.ts new file mode 100644 index 0000000..c51f13e --- /dev/null +++ b/tree-path-array.ts @@ -0,0 +1,33 @@ +import type { ExpectExtends, ExpectFalse, ExpectTrue } from '@type-challenges/utils' + +declare const example: { + foo: { + bar: { + a: string + } + baz: { + b: number + c: number + } + } +} + +type cases = [ + ExpectTrue, ['a']>>, + ExpectTrue, ['b'] | ['c'] >>, + ExpectTrue, ['bar'] | ['baz'] | ['bar', 'a'] | ['baz', 'b'] | ['baz', 'c']>>, + ExpectFalse, ['z']>>, +]; + +type Path< + T extends Record, + Keys extends keyof T = keyof T, +> = +Keys extends never + ? never + // This is the fancy part + : [Keys] | [Keys, ...( + T[Keys] extends Record + ? Path + : never + )];