如何限制Record推断类型,确保键与对应值类型匹配
解决方案
你的问题出在ContextParameter类型的定义上,当前写法通过infer KK把所有键合并成联合类型,导致{context: KK; value: X}里的KK和X是独立的联合,允许任意键与任意值类型组合。要让键和值严格匹配,需要为每个键单独生成对应的类型,再合并成联合。
修正后的代码如下:
import { HttpContextToken } from '@angular/common/http'; const tokens = { omitBaseUrl: new HttpContextToken(() => true), test: new HttpContextToken(() => ({ some: 'value' })), } as const; type Tokens = typeof tokens; // 为每个键单独生成对应的类型:要么是键本身,要么是键+对应值的对象 type ContextParameter = keyof Tokens | { [K in keyof Tokens]: { context: K; value: Tokens[K] extends HttpContextToken<infer X> ? X : never } }[keyof Tokens]; export function withContext(...contexts: ContextParameter[]) {} // 合法调用(全部通过类型检查) withContext('omitBaseUrl'); withContext('test'); withContext({ context: 'omitBaseUrl', value: true }); withContext({ context: 'test', value: { some: '' } }); // 非法调用(全部触发类型错误) withContext('xxx'); withContext(12); withContext({ context: 'omitBaseUrl', value: 12 }); withContext({ context: 'omitBaseUrl', value: { some: '' } });
原理说明
- 用映射类型
{ [K in keyof Tokens]: ... }遍历每个键K,为每个键生成专属的{context: K; value: 对应类型}对象类型 - 通过
[keyof Tokens]取映射类型的所有值,合并成联合类型 - 再和
keyof Tokens(单独传键的情况)合并,得到最终的ContextParameter
这样每个对象类型的context和value是严格绑定的,不会出现键值不匹配的情况。
内容的提问来源于stack exchange,提问作者MGX
相关产品推荐
相关产品推荐

