我有以下代码(Playground):
const routes = {
projects: ({}) => "/projects",
"projects.edit": ({ id }: { id: string }) => `/projects/${id}`,
report: ({ projectId }: { projectId: string }) => `/report/${projectId}`,
};
type Routes = typeof routes;
export function generateUrl<Name extends keyof Routes>(
name: Name,
params: Parameters<Routes[Name]>[0]
): string {
const fn = routes[name];
return fn(params);
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误fn(params)。我将如何编写它进行类型检查(不使用any)?
类型'{projectId:string;类型中缺少属性'id' }”,但在类型“ {{id:string; }'。
这是另一个解决方案
,它允许您拥有采用多个参数的路由。
type Route = (...args: any[]) => string;
type Routes = {
[index: string]: Route;
};
function createUrlGenerator<T extends Routes>(router: T) {
return <K extends keyof T>(name: K, ...params: Parameters<T[K]>): string => {
return router[name].apply(null, params);
}
}
const routes = {
projects: ({}) => "/projects",
"projects.edit": ({ id }: { id: string }) => `/projects/${id}`,
report: ({ projectId }: { projectId: string }) => `/report/${projectId}`,
multyParams: (id: number, query: string) => `${id}/${query}`
};
export const generateUrl = createUrlGenerator(routes);
generateUrl('multyParams', 123, '43');
generateUrl('multyParams', 123); // Exception
generateUrl('projects.edit', { id: '123' });
generateUrl('projects.edit', { id: 123 }); // Exception
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |