typescript 从对象读取单个属性-未定义

h5qlskok  于 2023-05-19  发布在  TypeScript
关注(0)|答案(3)|浏览(201)

我无法让它读取对象中的单个属性。下面的代码给我一个undefined当我尝试读取_id。

interface SINGLEUSER  {
 _id:string,
 name:string,
 email:string,
 image:string,
 emailVerified: any
}

console.log("UPDATE" )

const user_:SINGLEUSER = JSON.stringify(user) as unknown as SINGLEUSER

//Undefined
console.log(user_._id)

//Works
console.log(user_)

console.log(account!!.provider)

await User_.findOneAndUpdate({_id:user_._id },{provider: account!!.provider})

console.log("UPDATED" )

输出:
UPDATE未定义的凭据UPDATED
但是如果我只记录整个user对象,它会显示右:

{"_id":"645e2c7e31041f8404b8a260","name":"Max Mustermann ","email":"max.mustermann@t-online.com","image":"https://...","emailVerified":null}
de90aj5v

de90aj5v1#

使用JSON.parse代替JSON.stringify

const user_:SINGLEUSER = JSON.parse(user) as unknown as SINGLEUSER
wgx48brx

wgx48brx2#

JSON.stringify将对象转换为字符串,因此除非使用JSON.parse解析对象,否则无法访问对象的属性。
为什么要使用JSON.stringify

r3i60tvu

r3i60tvu3#

这将帮助您:
您可以使用类,因为它们的工作方式类似于TS中的类型/接口:

class SINGLEUSER {
 _id = '',
 name = '',
 email = '',
 image = '',
 emailVerified = false
}

然后你可以像这样创建一个对象清理器/解析器函数:

function clearParseObject<T>(C: any, o: any, f: any = {} ): T {
  Object.keys( C ).forEach( ( key: any ) => {

      const keyType = typeof C[ key ]
      const Value = o[ key ] ?? C[ key ] 

      if (
        !!Value &&
        keyType === 'object' &&
        Object.keys( Value ).length > 0
      ) {
        // if key is another object
        if ( !Array.isArray( Value ) ) {
          f[ key ] = clearObject( C[ key ], Value )
          return f
        }

        // if key is an array
        Value.forEach( ( itens: any ) => {
          f[ key ] = clearObject( C[ key ], itens, f[ key ] )
          return f
        } )
      }
      
      // assign the value to it's key
      f[ key ] = Value
    } )
    // return the new object cleared and typed
    return f as T
}

这个函数将为类型类的每个键循环,并从对象中只获取类型类中存在的键,然后创建一个新对象并返回它。你可以这样使用它:

const user: any = {
  name: 'John',
  _id: '123',
  email: 'abc@123',
  image: '',
  emailVerified: false,
  otherPropNotListed: 'anything'
}

const user_ = clearParseObject<SINGLEUSER>(new SINGLEUSER(), user)

console.log(`user id: ${user_._id}`) // logs '123'
console.log(`user otherPropNotListed: ${user_.otherPropNotListed}`) // logs undefined

请注意,现在user_变量来自SINGLEUSER类型,如果您尝试从中获取otherPropNotListed,TS将显示错误,因为它不存在于SINGLEUSER类型中。
这适用于任何对象,你想清除/类型的基础上类没有任何TS错误
Here's a code sandbox example
或者,如果您愿意,也可以使用simplified版本

相关问题