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

Ben*_*ene 6 generics types typescript

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

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

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

这里的问题是有一个错误

No index signature with a parameter of type 'string' was found on type 'Car'
Run Code Online (Sandbox Code Playgroud)

将密钥投射到keyof Car它的工作时,但一旦使用"noImplicitAny": true就会再次出现错误

Type 'string | number' is not assignable to type 'never'
Run Code Online (Sandbox Code Playgroud)

有没有办法以类型安全的方式解决这个问题。将汽车投射到任何位置都可以,但我想避免它。

非常感谢贝内

spe*_*der 5

这个问题激发了我重新审视我遇到的类似问题。

虽然你的问题不是一个直接模拟(即这是一个纯函数,它返回一个new对象,而不是修改调用者提供的参数),这里是通过使用对象的传播,而不是的保留类型安全的更新功能Object.entries()函数来完成其工作:

function updateFromPartial<T>(obj: T, updates: Partial<T>):T { 
    return {...obj, ...updates}; 
}
Run Code Online (Sandbox Code Playgroud)