【问题标题】:Union of generics in array数组中的泛型联合
【发布时间】:2022-01-22 20:14:14
【问题描述】:

我试图在数组中获取泛型的联合类型,但只能检索泛型从实际实现中扩展的内容。

type Params = Record<string, number | string | null | undefined> | undefined;
type Route<T extends Params = undefined> = {
  params: T
}
type Stack = {
  routes: Route<Params>[];
}

const route1: Route<{ detailUrl: string }> = { ... };
const route2: Route<{ head: string }> = { ... };
const route3: Route = { ... };

const routeRegistry: Stack = {
  routes: [route1, route2, route3]
};
type UnionOfParams = ExtractGeneric<typeof routeRegistry['routes'][number]>;
// expected: { detailUrl: string } | { head: string } | undefined
// received: Params

我知道 const 断言对于限制类型推断的扩展很有用,但在这种情况下使用它并没有产生任何结果。

我找不到与此特定问题相关的任何内容。有没有办法完成我的要求?

【问题讨论】:

  • 你没有包含ExtractGeneric

标签: typescript typescript-generics


【解决方案1】:

您不能对变量进行推断和注释。这只能通过一个函数来完成。一个函数可以有一个泛型类型参数,它既约束参数又提供推理工具:


function createRouteRegistry<T extends Stack>(p: T): T {
  return p
}

const routeRegistry = createRouteRegistry({
  routes: [route1, route2, route3]
})

type ExtractGeneric<T> = T extends Route<infer P> ? P : never
type UnionOfParams = ExtractGeneric<typeof routeRegistry['routes'][number]>;

Playground Link

【讨论】:

  • 抱歉,routeRegistry的类型应该是Stack,我更新了有问题的代码。
  • @HakanÖzdemir 如果routeRegistry 的类型必须是Stack,则没有捕获有关传入的实际参数的信息。您想在捕获时将类型限制为Stack实际类型?
  • 是的。在我的实际代码中会有几个“routeRegistry”,所以我希望它们中的每一个都只包含类型为 Route 的路由。所以是的,我都想将它们限制在 Route 并捕获实际实现的 Params。
猜你喜欢
  • 2021-09-02
  • 2020-04-12
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2020-09-17
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多