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

TypeScript中如何限制Record/对象的键,禁止使用保留键?

解决TypeScript中禁止传入对象包含指定键或值的问题

你当前的实现仅能检测值的冲突,但键的约束未生效——原因在于Exclude<T, DimensionKeys>的写法无法正确限制传入对象的键:当泛型T包含DimensionKeys的成员时,Exclude<T, DimensionKeys>会被解析为never,而TypeScript允许非空对象赋值给Record<never, ...>类型,导致键的冲突无法被检测。

以下是两种可行的解决方案,均可同时限制传入对象的键和值不能与DIMENSIONS的键值重复:

方案一:条件类型约束

const DIMENSIONS = {
  userType: 1,
  moduleVersion: 2
} as const;

type DimensionKeys = keyof typeof DIMENSIONS;
type DimensionValues = typeof DIMENSIONS[DimensionKeys];

function process<YourDim extends Record<string, number>>(
  yourDimensions: YourDim extends Record<infer K, infer V> 
    ? (K extends DimensionKeys ? never : V extends DimensionValues ? never : YourDim)
    : never
) {
  return {...yourDimensions, ...DIMENSIONS};
}

// 合法输入,正常执行
const myCorrectDimensions = { country: 33 } as const;
const combinedDimensions = process(myCorrectDimensions);

// 值冲突,触发类型错误
const myInvalidValueDimensions = { country: 1 } as const;
const badDimensions = process(myInvalidValueDimensions);

// 键冲突,触发类型错误
const myInvalidKeyDimensions = { userType: 79 } as const;
const badDimensions2 = process(myInvalidKeyDimensions);

该方案通过条件类型直接检查传入对象的键K和值V:只要K属于DimensionKeys,或V属于DimensionValues,就会返回never类型,强制TypeScript抛出错误。

方案二:直接泛型约束

const DIMENSIONS = {
  userType: 1,
  moduleVersion: 2
} as const;

type DimensionKeys = keyof typeof DIMENSIONS;
type DimensionValues = typeof DIMENSIONS[DimensionKeys];

function process<
  K extends Exclude<string, DimensionKeys>,
  V extends Exclude<number, DimensionValues>
>(yourDimensions: Record<K, V>) {
  return {...yourDimensions, ...DIMENSIONS};
}

// 合法输入,正常执行
const myCorrectDimensions = { country: 33 } as const;
const combinedDimensions = process(myCorrectDimensions);

// 值冲突,触发类型错误
const myInvalidValueDimensions = { country: 1 } as const;
const badDimensions = process(myInvalidValueDimensions);

// 键冲突,触发类型错误
const myInvalidKeyDimensions = { userType: 79 } as const;
const badDimensions2 = process(myInvalidKeyDimensions);

这种写法更简洁,直接通过泛型约束K为排除DimensionKeys的字符串类型,V为排除DimensionValues的数字类型,从根源上限制了传入对象的键值范围。

内容的提问来源于stack exchange,提问作者pseudogram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:41