如何遍历并修改TypeScript对象,不丢失类型且避免原地突变
解决TypeScript遍历重构对象时的类型不匹配问题
问题根源
你遇到的报错是TypeScript类型推断的限制导致的:Object.entries()返回的键会被默认推断为string类型,而非myObj的具体属性名('arr1'|'arr2');同时reduce的初始值{}被识别为空对象,最终合并后的类型是{[x: string]: number},这个类型无法保证包含myObj要求的必填属性,因此触发类型校验错误。
解决方案1:直接断言类型(快速修复)
通过手动断言键的类型和reduce初始值的类型,让TypeScript明确最终对象符合myObj类型:
type myObj = { arr1: number arr2: number } const c: myObj = {arr1: 1, arr2: 1} const d: myObj = Object.entries(c) .map(entry => { // 将键断言为myObj的属性名,收窄类型范围 const prop = entry[0] as keyof myObj; const value = entry[1]; // 这里可以自定义值的处理逻辑,比如乘2 return {[prop]: value * 2}; }) // 将初始值断言为myObj,确保合并后的类型匹配 .reduce((a, e) => ({...a, ...e}), {} as myObj);
解决方案2:泛型函数(通用场景)
如果需要多次处理类似结构的对象,写一个泛型函数可以更优雅地复用逻辑并保留类型:
type myObj = { arr1: number arr2: number } // 泛型函数:接收对象和值转换函数,返回同类型的新对象 const transformObject = <T extends object>( obj: T, transformFn: (value: T[keyof T], key: keyof T) => T[keyof T] ): T => { return Object.entries(obj).reduce((acc, [key, val]) => { const typedKey = key as keyof T; return { ...acc, [typedKey]: transformFn(val, typedKey) }; }, {} as T); }; const c: myObj = {arr1: 1, arr2: 1}; // 使用函数处理值,比如给每个值加1 const d: myObj = transformObject(c, (value) => value + 1);
说明
两种方案都通过解构赋值创建新对象,避免了原地突变;同时通过类型断言或泛型让TypeScript正确识别最终对象的结构,满足myObj的类型要求。
内容的提问来源于stack exchange,提问作者Lol Lol
相关产品推荐
相关产品推荐

