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
相关产品推荐
相关产品推荐

