Open4

【TypeScript】関数で1つめの引数に応じて2つめの引数のオプショナルを切り替える

きよしろーきよしろー

やりたいこと

パス文字列とパスパラメータみたいな2つを受け取る関数にて、

// valid
func('/posts/[id]', { id: 'foo' }) // ひとつめの引数が'/posts/[id]'であれば、2つめの引数は必須
func('/about') // そうでなければ、2つめの引数はオプショナル

// invalid
func('/posts/[id]')
きよしろーきよしろー

結論

StackOverflowのどこかで見た回答をもとに書いているが、該当質問が思い出せない。。。

function func<T>(
  path: T,
  ...params: T extends '/posts/[id]'
    ? [params: { id: string, query?: Record<string, unknown> }]
    : [params?: {query?: Record<string, unknown>}]
) {}
ootideaootidea

関数のオーバーロードを使うとextendsよりは可読性が上がるかもしれません