TypeScript联合检查是否存在对象键



我有一个接受有效负载的函数,该有效负载的一部分是data属性,它可以是对象数组,也可以是具有特定属性的对象。根据有效载荷上是否提供了某个密钥,在本例中为propA,我希望返回该密钥的值,或默认值150。我为数据属性创建了一个并集类型,如FunctionInterface示例所示。

问题是这会导致TS错误...Property 'propA' does not exist on type 'Record<string, unknown>[]'.

我如何更新我的函数接口或函数体来处理这样的东西?

interface FunctionInterface {
data: Record<string, unknown>[] | { propA: number, propB?: string[] }
}
function myFunction(payload: FunctionInterface) {
return payload.data.propA || 150;
}
const result1 = myFunction({ data: { propA: 4 } }); // expect 4
const result2 = myFunction({ data: [{ 'a': 1, 'b': 2 }, { 'a': 3, 'b': 4 }] }); // expect 150

TS游乐场示例

Typescript正在抱怨,因为它不允许访问可能不存在的属性。

这里的data属性要么是数组,要么是对象,所以您需要处理这两种情况。

最简单的方法可能是检查.data是否是一个数组,然后返回默认值,否则返回属性。

function myFunction(payload: FunctionInterface) {
return Array.isArray(payload.data) ? 150 : payload.data.propA
}

这是因为一旦测试数据是否是数组,typescript就会记住这一点,并知道如果检查失败,那么该值必须是联合的唯一其他成员。

游乐场

最新更新