如何仅通过fn获取namespace为a时key的TypeScript泛型约束类型?
如何从泛型函数fn中获取指定namespace对应的key类型?
仅能访问外部库导出的fn函数时,想要获取当namespace为"a"时参数key的类型,之前尝试类似Parameters<fn>['a', infer T]的写法无法生效。外部库的代码如下:
type ParamMap = { a: "a1" | "a2"; b: "b1" | "b2"; }; type Params<T extends keyof ParamMap> = ParamMap[T]; export const fn = <Namespace extends keyof ParamMap, Val extends Params<Namespace>>( namespace: Namespace, key: Val ): string => `${namespace}.${key}`;
解决方案
可以通过条件类型结合泛型推断来实现,核心是匹配fn在第一个参数为"a"时的函数签名,从而提取第二个参数的类型:
// 写法一:直接通过条件类型推断 type KeyTypeForA = (typeof fn) extends (n: "a", k: infer K) => any ? K : never; // 写法二:结合Parameters工具类型 type KeyTypeForA2 = Parameters<(typeof fn) extends (n: "a", k: infer K) => any ? typeof fn : never>[1];
两种写法最终都会得到KeyTypeForA的类型为"a1" | "a2",完全符合需求。
内容的提问来源于stack exchange,提问作者BobtheMagicMoose
相关产品推荐
相关产品推荐

