TypeScript如何基于对象数组动态推导生成对象的类型
首先你需要先固定原始数组的字面量类型,否则TypeScript会把数组元素的name字段推导为通用的string类型,无法生成指定固定键的类型结构。
完整实现步骤
- 给原始数组添加
as const断言,固定内部字段为字面量类型
const arr = [ { name: 'john', age: '20' }, { name: 'anna', age: '30' } ] as const;
- 从数组类型中提取构造目标对象类型
// 提取所有name的字面量联合类型:"john" | "anna" type ArrNameUnion = typeof arr[number]['name']; // 生成和需求一致的对象类型 interface IObj { [key in ArrNameUnion]: number }
- 按照类型要求生成obj对象
这里提供两种写法:
- 推荐用
Object.fromEntries写法,类型适配更自然:
// 注意原age是字符串类型,要转成数字匹配number类型要求 const obj: IObj = Object.fromEntries( arr.map(item => [item.name, Number(item.age)]) );
- 如果你坚持用原来的
forEach写法,需要提前给空对象做类型断言:
const obj: IObj = {} as IObj; arr.forEach(o => obj[o.name] = Number(o.age));
完成以上步骤后,obj就会拥有你需要的类型结构:访问obj.john、obj.anna会有正确的number类型提示,写错键名时TypeScript会直接抛出类型错误。
内容的提问来源于stack exchange,提问作者kofyohugna
相关产品推荐
相关产品推荐

