typescript 如何将对象A中各元素的值复制到另一个对象B,只复制A和B同时存在元素

比如下面这个例子:

class A{
    a1: string;
    a2: stirng;
    ...
    c: string;
}

class B{
    a1: string;
    a2: stirng;
    ...
    b: string;
}

var a = new A();
a.a1 = '1';
a.a2 = '2';
a.c = '2';

var b = ?

如何只将 A.a1 A.a2 等 B 中存在的属性赋值给 b 呢?
我试过

var b = <B><any>a;   
var b = a as B;  
Object.assign(b,a);

这些方法都会将 B 中不存在的属性 A.c 也复制过去

阅读 18.9k
2 个回答

首先要说明的是 TypeScript 是要转成 JavaScript 来运行的,所以 TypeScript 中提供的很多特性也只不过是在 tsc(转译) 的阶段使用,比如你上面定义的两个类,转成 JavaScript 之后实际是两个空类

var A = /** @class */ (function () {
    function A() {
    }
    return A;
}());
var B = /** @class */ (function () {
    function B() {
    }
    return B;
}());

所以,实际上 JavaScript 解释器并不知道在 TypeScript 中为 AB 定义的属性,因为类型相关的声明都在 tsc 过程中被擦除了。

从另一个方面,如果存在两个对象 ab (不管它们是不是 AB 的实例),要把 b 中存在的属性从 a 中拷贝过来,可以这样

const a = new A();
a.a1 = "hello";
a.a2 = "hi";

const b = new B();
b.a1 = "";
b.a2 = "";

function copy(source, dest) {
    for (let key in dest) {
        if (source.hasOwnProperty(key)) {
            dest[key] = source[key];
        }
    }
}

copy(a, b);
console.log(b);

输出

B { a1: 'hello', a2: 'hi' }

ts不支持这种复制,你可以自己写个复制函数。

function copyObjWhenKeyEqual(copyFrom: Object, copyTo: Object): Object {
    const keysTo = Object.keys(copyTo);

    for (const key of keysTo) {
        if (copyFrom[key] !== undefined) {
            copyTo[key] = copyFrom[key];
        }
    }
    return copyTo;
}

使用:

var a = new A();
var b = new B();
copyObjWhenKeyEqual(a, b)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进