TypeScript 4.9.5中如何检测枚举作为对象键的重复属性错误?
解决TypeScript 4.9.5中枚举作为对象键的重复属性检测问题
方法1:用辅助函数约束对象创建
定义一个返回指定类型的辅助函数,将对象字面量作为参数传入,TypeScript 4.9.5会对函数参数里的重复计算属性触发错误提示:
enum TestEnum { value1 = 'value1', value2 = 'value2', } // 辅助函数,约束输入对象必须匹配枚举键的类型 function createEnumRecord<T extends string>(obj: Record<T, number>): Record<T, number> { return obj; } // 此处重复的[TestEnum.value1]会被TS检测到错误 const variable = createEnumRecord<TestEnum>({ [TestEnum.value1]: 5, [TestEnum.value2]: 7, [TestEnum.value1]: 9, // 错误:重复的属性 });
方法2:启用ESLint的no-dupe-keys规则
ESLint的no-dupe-keys规则可以检测对象字面量中所有重复的键,包括计算属性形式的枚举键,不受TypeScript版本限制。
在ESLint配置中启用该规则:
{ "rules": { "no-dupe-keys": "error" } }
启用后,代码里的重复计算属性会被ESLint标记为错误,能在开发阶段提前发现问题。
方法3:拆分键值对后合并(从写法上规避重复)
先分别定义每个枚举键对应的键值对,再通过对象展开或Object.assign合并,从写法上降低重复赋值的概率:
enum TestEnum { value1 = 'value1', value2 = 'value2', } const value1Entry = { [TestEnum.value1]: 5 }; const value2Entry = { [TestEnum.value2]: 7 }; // 合并后不会出现重复键,若重复定义entry会被覆盖,但写法更易排查 const variable = { ...value1Entry, ...value2Entry } as { [key in TestEnum]: number };
内容的提问来源于stack exchange,提问作者mhd sah
相关产品推荐
相关产品推荐

