簡體   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