この解答例は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を渡す必要があります。関数の中で${}を使用することで、再帰的に呼び出された結果を連結することができます。