Typescript-使用Object.entries动态更新对象属性

时间:2020-08-25 09:42:49

标签: typescript generics types

我想实现一个循环对象的属性并将更新应用于相同类型的另一个对象的函数。

interface Car {
  tires: number;
  name: string;
}

function updateCar(car: Car, updates: Partial<Car>) {
  Object.entries(updates).forEach(([key, value]) => {
    car[key] = value;
  })
}

这里的问题是有错误

No index signature with a parameter of type 'string' was found on type 'Car'

将密钥投射到keyof Car时可以使用,但是一旦使用"noImplicitAny": true就会再次出现错误

Type 'string | number' is not assignable to type 'never'

有没有一种方法可以解决类型安全问题。将汽车抛向任何人都可以,但是我想避免。

非常感谢 贝恩

2 个答案:

答案 0 :(得分:3)

这个问题促使我重新审视我遇到的类似问题。

虽然不是您问题的直接模拟(即,这是一个返回new对象的纯函数,而不是修改调用者提供的参数),但这是一个更新函数,它通过使用object-来保持类型安全性展开而不是使用Object.entries()函数来完成其工作:

function updateFromPartial<T>(obj: T, updates: Partial<T>):T { 
    return {...obj, ...updates}; 
}

答案 1 :(得分:0)

这与我能得到的一样是类型安全的。唯一未正确键入的内容是car[key]。显然,这不是一个完美的解决方案。

interface Car {
  tires: number;
  name: string;
}

function updateCar(car: Car, updates: Partial<Car>) {
    for (const update in updates) {
        const key = update as keyof Car;
        (car[key] as any) = updates[key];
    }
}