繁体   English   中英

仅动态复制 Typescript 中 2 个相同类型的 object 之间的一些属性

[英]Dynamic copy only some properties between 2 same typed object in Typescript

大家好,我在尝试动态合并 2 个对象时遇到 tsc 编译错误:我尝试仅合并 object 的某些属性,不想复制所有这些属性。 下面的例子是typescript Class中的一个方法,它实现了与接收参数“iUser”相同的接口,因此“this”与接收参数的类型相同( “userSave”

例子:

 updatefromUser(userSave: iUser) {
            let propToValidate: (keyof iUser)[]
            propToValidate = ["Country", "City", "State", "Zip", "VATnr", "Language"]
            let updateData: boolean = false;
            propToValidate.forEach(ele => {
                if (this[ele] != userSave[ele]) {
                    this[ele] =  userSave[ele]
                    updateData = true
                }
            });
            return updateData
        }

编译错误说:

错误 TS2322:类型“字符串 | 字符串[] | 日期 | iAuthUserId[] | iAuthUser[] | null' 不可分配给类型 'string & iAuthUserId[] & iAuthUser[] & Date & string[]'。 类型 'null' 不可分配给类型 'string & iAuthUserId[] & iAuthUser[] & Date & string[]'。 类型“null”不能分配给类型“string”。 112 这个[ele] = userSave[ele] ~~~~~~~~~

任何人都知道如何动态地做到这一点?

也许 class 定义中的某些属性比 iUser 界面中的属性更严格? 因为您的错误告诉了与此类似的内容。 例如,考虑以下代码:

interface iUser {
  id: string,
  name: string|null
}

class User implements iUser {
  id: string;
  name: string;

  update(userSave: iUser) {
    let propToValidate: (keyof iUser)[]
    propToValidate = ["id", "name"]
    let updateData = false;
    propToValidate.forEach(ele => {
      if (this[ele] != userSave[ele] && typeof this[ele] === typeof userSave[ele]) {
          this[ele]=  userSave[ele]
          updateData = true
      }
    });
    return updateData
  }
}

iUser 界面允许名称为 null,但 class 不允许。 会有类似你的错误,不幸的是它没有告诉我们 iUser 的确切属性与用户 class 不兼容。

可能的解决方案是使所有属性相同,或者检查 iUser 和 class 中不同的属性,如下所示:

...
propToValidate.forEach(ele => {
  if (this[ele] != userSave[ele] && typeof this[ele] === typeof userSave[ele]) {
      if (ele === 'name') {
        this[ele] =  userSave[ele] ?? ''
      }
      else {
        this[ele]=  userSave[ele]
      }
      updateData = true
  }
});
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM