我正在处理一个具有嵌套路由的路由库,我试图在其中定义子处理程序函数来推断父路径.原因是我有另一种类型,可以从字符串(例如,users/:id{ 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美元到操场)

我就快到了,除了dataPath应该被推断为/some/deeply/nested而不是/${string}/${string}/${string},path应该被推断为/route而不是/${string}.这在我看来,我在RawRouterDefn机型中遗漏了一些东西.

因此,我似乎可以正确地缩小弦的形状,但不能用我目前的方法进一步缩小.

同样,我需要在将其用作函数参数时进行推断,而不是在之后.

推荐答案

非常接近,只需要对泛型做一点魔术:

function createRouter<T extends RawRouterDefn, R extends Router<T, "">>(rawDefn: R): R {

现在它起作用了:https://tsplay.dev/NDRE1W

您需要另一个泛型来告诉TypeScrip您在函数中得到的就是您返回的内容.go 掉T extends RawRouterDefn和使用R extends Router<RawRouterDefn, "">打破了这个推论,所以,呃,不要这么做.

Javascript相关问答推荐

为什么剧作家在导航时会超时?

验证嵌套 colored颜色 代码的结果

未使用Outlet渲染子组件

为什么我的第二个OnClick Isloading值在TEK查询Mutations 查询中不起作用?

zoom svg以适应圆

字节数组通过echo框架传输到JS blob

如何用显示网格平滑地将元素从一个地方移动到另一个地方?

在JavaScript中声明自定义内置元素不起作用

在拖放时阻止文件打开

如何在模块层面提供服务?

当Redux提供程序访问Reduxstore 时,可以安全地从Redux提供程序外部调用钩子?

Next.js服务器端组件请求,如何发送我的cookie token?

try 使用javascript隐藏下拉 Select

从页面到应用程序(NextJS):REST.STATUS不是一个函数

Rxjs流中生成IMMER不能在对象上操作

元素字符串长度html

搜索功能不是在分页的每一页上进行搜索

MongoDB受困于太多的数据

更新Redux存储中的对象数组

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复