この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - TypeScript タイプパズル
57. implement ObjectPaths<O>
type ObjectPaths<O, K extends keyof O = keyof O> = K extends string ? O[K] extends Record<string, any> ? `${K}.${ObjectPaths<O[K]>}` : K : never;type Obj = { a: { b: { c: 1, d: 2 }, e: 1 }, f: 3}type A = ObjectPaths<Obj>// 'a.b.c' | 'a.b.d' | 'a.e' | 'f'
解説:
ObjectPaths
は2つの型引数を取ります。ひとつは解析するオブジェクト型、もう一つは再帰的にプロパティを続けるためのキー。つまり、最初はルートオブジェクトについて探索を始めます。- 最初の
extends
句は、K
がstringリテラルであり、KがOのプロパティと互換性があることを確認します。 - 残りの行で、
O[K]
がオブジェクトであるかどうかを確認します。オブジェクトであれば、再帰的にObjectPaths
を呼び出します。オブジェクトでなければ、キー("K")を返して関数を終了します。 - TypeScriptの
${}
構文は、文字列リテラルで一部のテンプレート処理を行うものです。${}
にLHSとRHSを渡す必要があります。関数の中で${}
を使用することで、再帰的に呼び出された結果を連結することができます。