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

如何遍历并修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:55:18