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