假设我有以下接口,它定义了一个函数:

export declare interface NavigationGuard {
    (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext): NavigationGuardReturn | Promise<NavigationGuardReturn>;
}

我想以这种类型结束:

export SomeNavigationGuardType = (to: RouteLocationNormalized, from: RouteLocationNormalized): NavigationGuardReturn | Promise<NavigationGuardReturn>

利用最初的NavigationGuard型……

我try 使用实用程序类型Parameters,提取并使用Omit来删除下一个参数,但Parameters实用程序类型正在提取到元组.

我试着利用:

type NavigationGuardParams = Omit<Parameters<NavigationGuard>, 'next'>

export type UseRouterNivigationGuards = {
  beforeEach?: (arg: NavigationGuardParams) => ReturnType<NavigationGuard>
  beforeResolve?: (arg: NavigationGuardParams) => ReturnType<NavigationGuard>
  afterEach?: NavigationHookAfter
}

type NavigationGuardParams = Omit<Parameters<NavigationGuard>, 'next'>

export type UseRouterNivigationGuards = {
  beforeEach?: (...arg: NavigationGuardParams) => ReturnType<NavigationGuard>
  beforeResolve?: (...arg: NavigationGuardParams) => ReturnType<NavigationGuard>
  afterEach?: NavigationHookAfter
}

但这两个结果都会导致用法/参数错误,第一个结果如下:

"Expected 1 arguments, but got 2."

第二次try 给出:

"Argument of type '[RouteLocationNormalized, RouteLocationNormalized]' is not assignable to parameter of type 'NavigationGuardParams'."

因此,我请求帮助!有没有人有办法做到这一点?

推荐答案

您可以使用带infer的条件类型从Parameters返回的元组中删除next元素:

type SomeNavigationGuardType = (...args: Parameters<NavigationGuard> extends [...infer T, next: unknown] ? T : never) => ReturnType<NavigationGuard>

Typescript相关问答推荐

有没有办法解决相互影响的路由之间的合并?

如何以Angular 形式显示验证错误消息

使用TypeScrip根据(可选)属性推断结果类型

为什么T[数字]不也返回UNDEFINED?

打印脚本中的动态函数重载

角效用函数的类型推断

用于验证字符串变量的接口成员

有没有可能产生输出T,它在视觉上省略了T中的一些键?

如何从扩展接口推断泛型?

在类型脚本中创建泛型类型以动态追加属性后缀

如何将别名添加到vitest配置文件?

在组件卸载时try 使用useEffect清除状态时发生冲突.react +打字

如何编辑切片器以使用CRUD调用函数?

打字脚本中的模块化或命名空间

如何将通用接口的键正确设置为接口的键

垫子工具栏不起作用的Angular 布线

Typescript不允许在数组中使用联合类型

通过辅助函数获取嵌套属性时保留类型

Angular 16:无法覆盖;baseUrl;在tsconfig.app.json中

从函数参数推断函数返回类型