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

