如何从字符串数组生成TypeScript对象的实际类型?
从字符串数组生成对应对象类型的解决方案
要解决TypeScript无法推断数组转对象后具体类型的问题,按以下步骤操作即可:
1. 让数组保留具体的字面量类型信息
默认情况下,const myFields = ['field1', 'field2']会被推断为泛泛的string[],TypeScript会丢失每个元素的具体键名。我们可以用as const断言将其转为只读字面量元组,让TypeScript记住每个元素的精确值:
const myFields = ['field1', 'field2'] as const;
2. 基于数组元素生成目标对象类型
通过typeof myFields[number]提取数组所有元素的联合类型,再用映射类型为每个键指定string类型:
type MyObject = { [K in typeof myFields[number]]: string; };
TypeScript会自动将这个类型解析为你需要的结构:
type MyObject = { field1: string; field2: string; };
3. 修正对象生成代码的类型推断
最后给reduce的初始值加上类型断言,确保生成的myObject被正确推断为MyObject类型,而非空对象:
const myObject = myFields.reduce((obj, fld) => ({ ...obj, [fld]: `val of ${fld}` }), {} as MyObject);
现在访问myObject.field1就不会出现类型错误,TypeScript能准确识别它是string类型。
内容的提问来源于stack exchange,提问作者cap
相关产品推荐
相关产品推荐

