输入'字符串|数量 | boolean' 不可分配给类型 'undefined'。类型 'string' 不可分配给类型 'undefined'.ts(2322)

时间:2020-12-30 06:05:50

标签: javascript typescript object

我正在尝试创建一个部分对象,该对象仅具有满足条件的完整对象的某些字段。但是,当我尝试分配属性时,我收到了主题打字稿错误消息。我创建了一个测试模块来说明概念/问题。请注意,这只是为了说明问题。这不是实际的代码。

type FullObject = {
  id: number
  name: string
  active: boolean
}

type PartialObject = Partial<FullObject>

const myFullObj: FullObject = {
  id: 1,
  name: 'First Object',
  active: true,
}

const myPartialObj: PartialObject = {}

let k: keyof PartialObject

for (k in myFullObj) {
  if (myFullObj[k] !== undefined) myPartialObj[k] = myFullObj[k] // Error here
  if (k === 'name') myPartialObj[k] = myFullObj[k] // No error here
}

请注意,只有第一个“if”语句有错误。经过一些研究和尝试各种事情后,我通过将部分对象初始化为完整对象,然后删除不符合标准的属性来解决这个问题。由于这是解决问题的倒退方法,我更愿意创建具有满足条件的属性的部分对象。

1 个答案:

答案 0 :(得分:0)

我想出了以下解决方案。它清楚地说明了我想要做什么:如果源对象属性满足条件,则将该属性复制到部分目标对象中。在这个例子中,我使用“not undefined”作为标准。在实际代码中,标准更为复杂。

type FullObject = {
  id: number
  name: string
  active: boolean
}

type PartialObject = Partial<FullObject>

const myFullObj: FullObject = {
  id: 1,
  name: 'First Object',
  active: true,
}

let myPartialObj: PartialObject = {}

let k: keyof PartialObject

for (k in myFullObj) {
  if (myFullObj[k] !== undefined) myPartialObj = { ...myPartialObj, ...Object.fromEntries([[k, myFullObj[k]]]) }
}
console.log(JSON.stringify(myPartialObj, null, '  '))

似乎必须有更好的方法来实现这一点。但是,该示例说明了意图。