我正在开发一个带有嵌套路由的路由库,我试图定义一个推断父路径的子处理函数。原因是我有另一种类型,可以从字符串推断动态路径参数(例如,users/:id
to { id: string }
);因此,我希望能够将推断的路径参数从父路由传递到每个子路由处理函数中的任何和所有子路由。
这是我到目前为止所拥有的:
type RawRouterDefn<Namespace extends string = ""> = {
[K: string]: Handler<Namespace, typeof K> | RawRouterDefn<`${Namespace}/${typeof K}`>;
};
type Handler<DataPath extends string, Path extends string> = ((args: { dataPath: DataPath, path: Path }) => unknown)
type Router<Routes extends RawRouterDefn, DataPath extends string = ""> = {
[K in keyof Routes & string]: Routes[K] extends CallableFunction
? Handler<DataPath, K>
: Router<Routes[K], `${DataPath}/${K}`>;
};
function createRouter<T extends RawRouterDefn>(rawDefn: T): Router<T, ""> {
// Implementation not important right now
return {} as unknown as Router<T, "">
}
const router = createRouter({
some: {
deeply: {
nested: {
/**
* Here, dataPath should be inferred as `some/deeply/nested`,
* path should be `route`
*/
route: ({ dataPath, path }) => {}
},
},
},
});
const route = router.some.deeply.nested.route;
// Correctly inferred **after** function applied, I need it within the router definition
type Params = Parameters<typeof route>[0]
(以及link https://www.typescriptlang.org/play?#code/C4TwDgpgBASghgdxgewK7AgJwCIQGYB2APAHJwC2EAzmHAMbQQAeGBAJlVFcJgJYEBzKAF4oAIjEA%20EVADeAKACQAbQDSALi49%20AgLqaAEnHYAbLKQrVaDADRRQkZHiirpAH1iIU6LLkJEAAwASWTJKGnoIAF8AehCHCCcXKIDJAG55KIz5BKgjU3NsOGA4AAVigAsoZlYOLT5BO3LgKpqIdk5uBoFpUQAKPrhMASpNWSg2YrLKzSKS5oq7WhbNBagogEoRaVQCAGsCZAQCDfkc8GhvDEwiK%20pqlna6%20CQ0a78COznplofazu0ghkEl6ciUaig-CgewgICSd04ADJ6jp9LA3tQ1Lo-k9OABhOAmExwABGZgAYrs6MBeMgCEpFAB%20PLGNhmG7fBZ2VwMzR3G4IrF2YKyTmVWIhVQpdKZbJ4Kk0ulQOiYCDFCD8ogAFRxHU8rx8OHwBEkfUwiA%20mi1Gz5GJuWrsILBUCgMRiUAAkuQwGZKAQSoqCFBDsBId7kJgSv6oHwBBVQ4dUFQIPIXargKhMEHZFEoHBOLsDkcg-n0YbtY6pJkznQ6dwY3aZCq1Rh%20X0FIoqMhKGMGWwIBAfSBe4pRwRqBg2L2XTOZzEAFTz1Oz2fzvJYCB2SbzSpcCpoExsKAk6D8PBYVVH0sBLuUGL9wcmEAxcfcCBsAI2Zcrl1r5ZVKh91QQ9j2gAJMAxAJvx-ecYgZUcIJ8TR2wmKYuSgf91i2YRpBzeCoi-UcCKUYjNmyWsCHrRCMBkaisAAOlvCB6IfId6NfSd6LojI3SgPEI1Vakn0hAhz0wS8oEXOA8GuRcoHlAhqVpEswB9Xh3zsD1gwHI9eFDBA9IqKEWmgOjMAmfB%20D05TzkgKBynNchOFEBzLGuKgiASJI6MkZQAAZdCAA去游乐场)
我就快到了,除了dataPath
应该推断为/some/deeply/nested
并不是/${string}/${string}/${string}
and path
应该推断为/route
并不是/${string}
。这对我来说表明我缺少一些东西RawRouterDefn
type.
所以看来我可以正确地缩小字符串的形状,但用我目前的方法无法进一步缩小。
同样,我需要在用作函数参数时(而不是之后)推断它。