【问题标题】:Type 'string | number | boolean' is not assignable to type 'undefined'. Type 'string' is not assignable to type 'undefined'.ts(2322)键入'字符串 |号码 | boolean' 不能分配给类型 'undefined'。类型“字符串”不可分配给类型“未定义”.ts(2322)
【发布时间】:2021-04-06 17:00:38
【问题描述】:

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

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”语句有错误。经过一些研究和尝试各种事情后,我通过将部分对象初始化为完整对象然后删除不符合条件的属性来解决该问题。由于这是解决问题的一种倒退方式,因此我更愿意创建具有符合条件的属性的部分对象。

【问题讨论】:

  • myPartialObj 是一个空对象,因此您无法访问其中的键和值,因为它们是未定义的。你想在这里做什么?
  • 如上所述,我正在尝试创建一个部分对象,该对象仅包含满足某些条件的完整对象中的某些字段。我在实际代码中的解决方法是首先将完整的对象分配给部分对象,然后删除不符合条件的字段。
  • 好吧,您需要具体说明您要根据myFullObjmyPartialObj 设置值的k
  • “for in”循环循环遍历 myFullObj 的所有属性,并在每个循环中将 key 的值设置为 key。在我的实际代码中,myFullObj 中有非常多的属性,并且确定该值是否为副本的标准非常复杂。我相信你是说 k 参数不能像我试图做的那样在赋值的 lhs 上使用。相反,在这种情况下,需要将其指定为实际值(id、name 或 active)。在我的情况下,这将非常困难。
  • if (myFullObj[k] !== undefined) 对我来说真的没有意义,完整对象的属性永远不会未定义。

标签: javascript typescript object


【解决方案1】:

我想出了以下解决方案。它清楚地说明了我正在尝试做的事情:如果源对象属性满足条件,则将该属性复制到部分目标对象中。在这个例子中,我使用“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, '  '))

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

【讨论】:

  • 我今天遇到了这个问题。我发现使用Object.assign(myPartialObj, {[k]: myFullObj[k]}) 是编译器可以接受的,并且可以避免创建额外的对象。
猜你喜欢
  • 2021-08-19
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多