仅检查其存在后,TS属性不存在

时间:2018-09-28 10:16:47

标签: typescript

我有一个用户可以通过的对象,可以是任何类型的对象。在函数中,我检查一个道具,如果存在,我想将其返回:

if ('id' in payload) return payload.id

我已将payload声明为object
但是TypeScript给了我错误:

  

[ts]类型'object'上不存在属性'id'。

     

任何

即使我只是检查了它是否存在 ...

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

in运算符仅在变量为联合类型时才更改变量的类型(即充当类型保护)(它将变量的类型缩小为所有成员的联合)包含密钥)。

您可以将有效载荷类型声明为成员包含字段的联合:

let payload: object | { id: number };
if ('id' in payload)  payload.id // ok now

或者您可以使用类型断言:

let payload: object;
if ('id' in payload)  (payload as { id: number }).id // ok now

您也可以使用索引访问,但这仅在未将noImplicitAny指定为编译器选项的情况下才有效。 (此选项可防止各种重要错误,因此我不会将其停用)

let payload: object;
if ('id' in payload)  payload['id'] // ok if noImplicitAny  is not specified

答案 1 :(得分:0)

这是我正在使用的TS函数

/**
* function to get value from dynamic object by property name if the property exists.
* (if the property does not exists it returns undefined)
*
* @param {object} obj [the object you want to check]
* @param {string} property [the name of the property you want to get the value from]
* @returns {any|undefined}
**/
let getValueByProperty  = (obj: object, property: string): any => {
  // initalize out as undefined;
  let out: any;
  // check if property exists
  if(obj.hasOwnProperty(property){
    // get value from object.property with an array like call
    out = obj[property];
  }
  // return the value stored to out
  return out;
}