[英]How to use boolean assignment in ternary operator if optional prop is an array in TypeScript
我需要根据可选道具是否为数组来派生 object 属性。
我有这个任务:
const isRequestingMultipleDevices = Array.isArray(deviceIds);
然后这个 object:
{
data: isRequestingMultipleDevices
? deviceIds.map((deviceId) => getData(deviceId)) // Object is possibly 'undefined'
: (deviceIds && [getData(deviceIds)]) || [], // Object is possibly 'undefined'
};
它抱怨是因为deviceIds
是可选的。 但是,这很好:
{
data: Array.isArray(deviceIds)
? deviceIds.map((deviceId) => getData(deviceId))
: (deviceIds && [getData(deviceIds)]) || [],
};
我想使用isRequestingMultipleDevices
因为我在多个地方都需要它。
如何定义一次 boolean 并在任何地方使用它? TIA
作为免责声明,我必须承认我无法引发您报告的完全相同的错误,但我相信问题是由于我们比类型检查器更了解这种情况。 我的意思是:
在这个任务之后
const isRequestingMultipleDevices = Array.isArray(deviceIds);
我们知道以下内容:如果isRequestingMultipleDevices
为true
,则deviceIds
既是定义的,也是一个Array
。 如果它是false
,那么它可能是未定义的,它肯定不是一个数组。
稍后,当需要使用isRequestingMultipleDevices
时,
{
data: isRequestingMultipleDevices
? deviceIds.map((deviceId) => getData(deviceId))
: (deviceIds && [getData(deviceIds)]) || [],
};
尽管我们确定在三元表达式的第一个deviceIds
中既定义了 deviceIds 又是一个Array
,但类型检查器显然无法以相同的方式缩小类型(这可能有几个原因)。 因此,它会拒绝您对deviceIds.map
的调用。 getData(deviceIds)
的拒绝是出于类似的原因。
在第二种情况下,当您“内联”数组检查时,类型检查器能够推断出deviceIds
是第一个 arm 中的一个Array
,而不是第二个中的一个Array
,因此它接受整个表达式。
解决此问题的一种方法是在两个呼叫站点都包含deviceIds
的“类型断言” :
// Assuming the device ID(s) are strings:
{
data: isRequestingMultipleDevices
? (deviceIds as string[]).map((deviceId) => getData(deviceId))
: (deviceIds && [getData(deviceIds as string)]) || [],
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.