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

如何为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" // 新增多余键会触发类型错误
};

对现有思路的补充说明

  1. 字符串枚举:完全不需要,上述方案通过类型推断自动同步键集,避免手动维护30+个键的重复工作。
  2. 推断类型:你之前的思路问题在于直接移除obj_1的类型后无法约束值为FooClass,泛型辅助函数刚好解决了这个矛盾——既保留了键的自动推断,又确保所有值都是FooClass类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:45:27