用打字稿中的任何道具定义对象

时间:2018-10-03 06:10:52

标签: javascript typescript object properties

我刚刚从JavaScript切换到TypeScript,并且正在转换一堆代码。

我以前在JavaScript中经常使用此代码(已转换为TypeScript):

function isObject (payload: any): payload is object {
  const type: string = Object.prototype.toString.call(payload).slice(8, -1)
  return type === 'Object'
}

然后我会在JavaScript中执行类似的操作

if (isObject(payload) && payload.id) return payload.id

但是在TypeScript中,现在会给我一个错误:id上不存在object

因此,我认为我应该返回的东西应该是带有任何道具和任何值的对象,而不是在我的payload is object函数中返回isObject

我怎样才能做到最好?

1 个答案:

答案 0 :(得分:1)

您可以使用index signature来定义它,尽管我不确定与any相比,它会带来什么好处,因为您可以使用任何属性对其进行索引,但它并不适合那么类型安全性更高。

function isObject (payload: any): payload is { [name: string]: any} {
    return typeof payload === 'object'; // this should work just the same
}

let payload: any;
if (isObject(payload) && payload.id) payload.id

也许您要开始使用严格的空检查,那么好处之一就是您可以从结果类型中删除undefined

function isObject (payload: any): payload is { [name: string]: object | number | string | boolean | undefined} {

    return typeof payload === 'object'
}

let payload: any;
if (isObject(payload) && payload.id) payload.id // payload.id is string | number | true | object here