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

TypeScript动态生成对象时类型不匹配报错求助

解决TypeScript对象类型不匹配问题

问题背景

需要创建一个键名来自testArray的对象,目标结构如下:

{
  a: [ { key1: 0, key2: 0 }, { key1: 0, key2: 0 }, { key1: 0, key2: 0 } ],
  b: [ { key1: 0, key2: 0 }, { key1: 0, key2: 0 }, { key1: 0, key2: 0 } ]
}

编写的TypeScript代码在demoObject[t]处出现类型不匹配错误:

interface DemoObject {
  [key: string]: Array<{
    key1: number;
    key2: number;
  }>;
}

const testArray = ["a", "b"];
const innerKeys = ["key1", "key2"];
const demoObject: DemoObject = {};

testArray.forEach((t: string) => {
  demoObject[t] = Array.from({ length: 3 }, () =>
    Object.fromEntries(innerKeys.map((prop) => [prop, 0]))
  );
});

错误信息:

Type '{ [k: string]: number; }[]' is not assignable to type '{ key1: number; key2: number; }[]'.
Type '{ [k: string]: number; }' is missing the following properties from type '{ key1: number; key2: number; }': key1, key2

问题原因

Object.fromEntries()返回的类型是宽泛的{ [k: string]: number },TypeScript无法自动推断出该对象恰好包含key1和key2两个属性,因此无法匹配DemoObject中定义的数组元素类型。

解决方案

方案1:类型断言明确内部对象类型

直接给Object.fromEntries的结果添加类型断言,告知TypeScript它符合预期的内部对象结构:

interface DemoObject {
  [key: string]: Array<{
    key1: number;
    key2: number;
  }>;
}

const testArray = ["a", "b"];
const innerKeys = ["key1", "key2"];
const demoObject: DemoObject = {};

testArray.forEach((t: string) => {
  demoObject[t] = Array.from({ length: 3 }, () =>
    Object.fromEntries(innerKeys.map((prop) => [prop, 0])) as { key1: number; key2: number }
  );
});

方案2:用const断言让TS推断精确类型

给innerKeys添加as const断言,让TypeScript识别出它是固定元素的只读数组,再结合类型工具生成精确的内部对象类型:

interface DemoObject {
  [key: string]: Array<{
    key1: number;
    key2: number;
  }>;
}

const testArray = ["a", "b"];
const innerKeys = ["key1", "key2"] as const;
type InnerObject = { [K in typeof innerKeys[number]]: number };
const demoObject: DemoObject = {};

testArray.forEach((t: string) => {
  demoObject[t] = Array.from({ length: 3 }, () =>
    Object.fromEntries(innerKeys.map((prop) => [prop, 0])) as InnerObject
  );
});

方案3:手动构建内部对象(类型最安全)

避免使用Object.fromEntries,直接手动创建包含key1和key2的对象,让TypeScript自动准确推断类型:

interface DemoObject {
  [key: string]: Array<{
    key1: number;
    key2: number;
  }>;
}

const testArray = ["a", "b"];
const demoObject: DemoObject = {};

testArray.forEach((t: string) => {
  demoObject[t] = Array.from({ length: 3 }, () => ({
    key1: 0,
    key2: 0
  }));
});

这种方式无需额外类型断言,TypeScript能直接识别内部对象的结构,是类型安全性最高的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:58:54