Javascript 类型';字符串|数字|布尔值';不可分配给类型';未定义';。类型';字符串';不可分配给类型';未定义';。ts(2322)

Javascript 类型';字符串|数字|布尔值';不可分配给类型';未定义';。类型';字符串';不可分配给类型';未定义';。ts(2322),javascript,typescript,object,Javascript,Typescript,Object,我试图创建一个局部对象,它只有满足条件的完整对象的某些字段。但是,当我尝试分配属性时,会收到subject typescript错误消息。我创建了一个测试模块来说明这个概念/问题。请注意,这只是为了说明问题。它不是实际的代码 type FullObject = { id: number name: string active: boolean } type PartialObject = Partial<FullObject> const myFullObj: Ful

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

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
}

类型FullObject={
身份证号码
名称:string
活动:布尔值
}
类型PartialObject=Partial
常量myFullObj:FullObject={
id:1,
名称:“第一个对象”,
主动:对,
}
常量MyPartialObject:PartialObject={}
设k:PartialObject的键
for(myFullObj中的k){
如果(myFullObj[k]!==未定义)myPartialObj[k]=myFullObj[k]//此处出现错误
如果(k=='name')myPartialObj[k]=myFullObj[k]//这里没有错误
}

请注意,只有第一个“if”语句出错。经过一些研究和尝试各种方法后,我解决了这个问题,将部分对象初始化为完整对象,然后删除不符合条件的属性。由于这是一种解决问题的反向方法,因此我更愿意创建具有符合条件的属性的分部对象。

我提出了以下解决方案。它清楚地说明了我试图做的事情:如果源对象属性满足条件,则将该属性复制到部分目标对象中。在本例中,我使用“未定义”作为标准。在实际代码中,标准更为复杂

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, '  '))
类型FullObject={
身份证号码
名称:string
活动:布尔值
}
类型PartialObject=Partial
常量myFullObj:FullObject={
id:1,
名称:“第一个对象”,
主动:对,
}
让MyPartialObject:PartialObject={}
设k:PartialObject的键
for(myFullObj中的k){
如果(myFullObj[k]!==未定义)myPartialObj={…myPartialObj,…Object.fromEntries([[k,myFullObj[k]])}
}
log(JSON.stringify(myPartialObj,null,'))

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

myPartialObj
是一个空对象,因此您无法访问其中的键和值,因为它们未定义。你想在这里做什么?如上所述,我试图创建一个部分对象,其中只包含满足特定条件的完整对象中的特定字段。我在实际代码中的工作是首先将完整对象分配给部分对象,然后删除不符合条件的字段。您需要具体说明您希望基于
myFullObj
设置for
myPartialObj
值的
k
。“for in”循环遍历myFullObj的所有属性,并在每个循环中将key的值设置为key。在我的实际代码中,myFullObj中有大量的属性,确定值是否为副本的标准非常复杂。我相信你是说k参数不能像我想做的那样用在赋值的lhs上。相反,在这种情况下,需要将其指定为实际值(id、name或active)。在我的情况下,这将是非常困难的。
如果(myFullObj[k]!==undefined)
对我来说没有意义,那么完整对象的属性永远不会是未定义的。我今天遇到了这个问题。我发现编译器可以接受使用
Object.assign(myPartialObj,{[k]:myFullObj[k]})
并避免创建额外的对象。