項目62 レストパラメーターとタプル型を使って、可変長引数の関数をモデリングする
シグネチャが引数の型に依存する関数をモデリングするために、レストパラメータとタプル型を使用する
パスとクエリパラメータの関係を型にし、URLを組み立てる関数を定義する場合
code:ts
interface RouteQueryParams {
'/': null,
'/search': { query: string; language?: string; }
// ...
}
function buildURL(route: keyof RouteQueryParams, params?: any) {
return route + (params ? ?${new URLSearchParams(params)} : '');
}
上記の定義の場合、エラーになるべき記述が通ってしまう
code:ts
buildURL('/', {query: 'recursion'}); // エラーになるべき (トップページはパラメーターを取らない)
buildURL('/search'); // エラーになるべき(必要なパラメーターがない)
この場合は条件型とレストパラメータを使って、対応できる code:ts
function buildURL<Path extends keyof RouteQueryParams>(
route: Path,
...args: (
RouteQueryParamsPath extends null ? []
: [params: RouteQueryParamsPath] )
) {
return route + (params ? ?${new URLSearchParams(params)} : '');
}
buildURL('/search', {})
// ~~ Property 'query' is missing in type '{}' ...
buildURL('/', null);
// ~~~~ Expected 1 arguments, but got 2.