如何为obj_2设置TypeScript类型以匹配obj_1键集并触发类型错误?
解决TypeScript对象键集同步且值类型不同的问题
核心方案:泛型辅助函数约束值类型+自动推断键集
要同时满足以下要求:
obj_1的所有值必须是FooClass类型obj_2必须和obj_1拥有完全相同的键(缺失/多余键均触发类型错误),且值为string | null
可以通过泛型辅助函数实现,无需手动维护重复键集:
步骤1:创建obj_1并约束值类型
不要直接给obj_1添加Record<string, FooClass>类型(会丢失具体键的信息),改用泛型函数在推断键集的同时强制值类型:
// 辅助函数:约束输入对象的所有值为FooClass,同时保留键的具体类型 function createFooObj<T extends Record<string, FooClass>>(obj: T): T { return obj; } // obj_1的类型会被自动推断为 { key_1: FooClass; key_2: FooClass; key_3: FooClass } const obj_1 = createFooObj({ key_1: fooObj1, key_2: fooObj2, key_3: fooObj3, });
步骤2:为obj_2定义同步键集的类型
利用keyof typeof obj_1获取obj_1的完整键集,再映射为值类型是string | null的对象类型:
// 抽离复用类型(可选,提升代码可读性) type Obj2Type = { [K in keyof typeof obj_1]: string | null }; // obj_2必须包含obj_1的所有键,且不能有额外键 const obj_2: Obj2Type = { key_1: "fooKey1", key_2: null, key_3: "fooKey3", // 缺失该键会触发类型错误 // k4: "fooKey4" // 新增多余键会触发类型错误 };
对现有思路的补充说明
- 字符串枚举:完全不需要,上述方案通过类型推断自动同步键集,避免手动维护30+个键的重复工作。
- 推断类型:你之前的思路问题在于直接移除
obj_1的类型后无法约束值为FooClass,泛型辅助函数刚好解决了这个矛盾——既保留了键的自动推断,又确保所有值都是FooClass类型。
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

