我刚刚从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
。
我怎样才能做到最好?
答案 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