数组中的泛型联合

Posted

技术标签:

【中文标题】数组中的泛型联合【英文标题】: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 【参考方案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。

以上是关于数组中的泛型联合的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的泛型数组

Java中的泛型数组

Java数组中的泛型

如何从 C# 中的泛型类型数组中选择一组随机值?

请问下,C#的泛型数组中的 ToDictionary 方法怎么用? 详细说明请进。。

Java中的泛型