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>}]
) {}
関数のオーバーロードを使うとextendsよりは可読性が上がるかもしれません