You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:37:15