type A = { a: number, b: string };

let obj1: A = { a: 1, b: "1" };
let obj2: A = { a: 2, b: "2" };

let propKey: keyof A;

for (propKey in obj1) {
  obj2[propKey] = obj1[propKey];
}

console.log(obj2);

我怎么才能让上面的代码编译呢?

错误:

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

推荐答案

正如@jcalz在他的 comments 中提到的,按属性复制属性的最简单方法是使用Object.assign:

Object.assign(obj2, obj1);

或者,最短的是具有一个泛型函数,该函数接受对象类型和键的泛型参数:

const func = <T, K extends keyof T>(obj1: T, obj2: T, key: K) => {
  obj2[key] = obj1[key];
};

用途:

let obj1: A = { a: 1, b: '1' };
let obj2: A = { a: 2, b: '2' };

let propKey: keyof A;

for (propKey in obj1) {
  func(obj1, obj2, propKey);
}

playground

Typescript相关问答推荐

在TypScript手册中可以视为接口类型是什么意思?

JS Redux Devtools扩展不工作

迁移到Reaction路由V6时,获取模块Reaction-Router-Dom';没有导出的成员RouteComponentProps错误

Angular 错误NG0303在Angular 项目中使用app.Component.html中的NGFor

React重定向参数

如果数组使用Reaction-Hook-Form更改,则重新呈现表单

创建Angular 为17的动态形状时出错

跟踪深度路径时按条件提取嵌套类型

为什么上下文类型在`fn|curred(Fn)`的联合中不起作用?

如何将spread operator与typescripts实用程序类型`参数`一起使用

TypeScrip-根据一个参数值验证另一个参数值

TypeScrip:如何缩小具有联合类型属性的对象

如何在具有嵌套数组的接口中允许新属性

如何使函数参数数组不相交?

两个名称不同的相同打字界面-如何使其干燥/避免重复?

如何在TypeScript中描述和实现包含特定属性的函数?

如何键入';v型';

如何使用 runInInjectionContext 中的参数测试功能性路由防护

React-Router V6 中的递归好友路由

在Nestjs中,向模块提供抽象类无法正常工作