typescript - 数组中泛型的联合

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

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 断言对于限制类型推断的扩大很有用,但在这种情况下使用它不会产生任何结果。

我找不到与此特定问题相关的任何信息。有什么办法可以完成我的要求吗?

最佳答案

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


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

https://stackoverflow.com/questions/70434911/

相关文章:

javascript - React 中状态变量的顺序重要吗?

answer-set-programming - 使用答案集编程的 N 皇后问题

javascript - 如何制作一种类型取决于参数

python - 是否可以在 discord.py 中对不同的前缀使用不同的命令?

c# - 如何同步运行异步枚举器方法并将其存储为 IEnumerable?

c++ - 模板数据结构 - 访问从抽象类派生的模板类的 getter 和 setter

algorithm - 加权图的最短路径,但权重有点特殊

python - pandas mysql 如何使用 Dataframe 更新某些行列

python - 将二元运算符添加到 z3

c# - 检查ClassDeclarationSyntax是否实现了特定接口(interface)(