我有以下类型:

type AllRoutes = {
  Home: undefined
  Page: { id: string }
}

type NavFunction<RouteName extends keyof AllRoutes> = (
  ...args: AllRoutes[RouteName] extends undefined
    ? [RouteName]
    : [RouteName, AllRoutes[RouteName]]
) => void

如果我将这种类型直接放在这样的函数上,则可以按预期工作:
export function navigate<RouteName extends keyof AllRoutes>(
  ...args: AllRoutes[RouteName] extends undefined
    ? [RouteName]
    : [RouteName, AllRoutes[RouteName]]
) {
  ...
}

navigate('Home') // works!
navigate('Page', {id: 1}) // works!
navigate('Page') // Expected 2 args

我遇到的问题是我想将此类型应用于多种功能(每个功能用于不同的平台)。我似乎无法弄清楚如何将第一个类型应用于函数并使它像我刚刚发布的“直接”示例那样工作。

最佳答案

您可以为args部分创建一个帮助程序类型。也许还为keyof AllRoutes创建类型?

type RouteNames = keyof AllRoutes;
type GetArgs<RouteName extends RouteNames> = AllRoutes[RouteName] extends undefined
    ? [RouteName]
    : [RouteName, AllRoutes[RouteName]];

export function navigate<RouteName extends RouteNames>(
  ...args: GetArgs<RouteName>
) {
  ...
}

09-05 11:54