reactjs - 如果可选 prop 是 TypeScript 中的数组,如何在三元运算符中使用布尔赋值
问题描述
我需要根据可选道具是否为数组来派生对象属性。
我有这个任务:
const isRequestingMultipleDevices = Array.isArray(deviceIds);
然后这个对象:
{
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
,因为我在多个地方都需要它。
如何定义布尔值一次并在任何地方使用它?TIA
解决方案
作为免责声明,我必须承认我无法引发您报告的完全相同的错误,但我相信问题是由于我们比类型检查器更了解情况。我的意思是:
在这个任务之后
const isRequestingMultipleDevices = Array.isArray(deviceIds);
我们知道以下内容:如果isRequestingMultipleDevices
是true
,那么deviceIds
既是定义的又是Array
一个。如果它是false
,那么它可能是未定义的,它肯定不是一个数组。
以后,到了要用 isRequestingMultipleDevices
的时候,
{
data: isRequestingMultipleDevices
? deviceIds.map((deviceId) => getData(deviceId))
: (deviceIds && [getData(deviceIds)]) || [],
};
即使我们确定在三元表达式的第一臂中deviceIds
既是定义的又是 an Array
,类型检查器显然无法以相同的方式缩小类型(这可能有几个原因)。因此,它会拒绝您对deviceIds.map
. 拒绝的getData(deviceIds)
发生出于类似的原因。
在第二种情况下,当您“内联”数组检查时,类型检查器能够推断出在第一个分支中deviceIds
是 an Array
,而不是Array
在第二个分支中,因此它接受整个表达式。
解决此问题的一种方法是在两个呼叫站点都包含“类型断言” :deviceIds
// Assuming the device ID(s) are strings:
{
data: isRequestingMultipleDevices
? (deviceIds as string[]).map((deviceId) => getData(deviceId))
: (deviceIds && [getData(deviceIds as string)]) || [],
};
推荐阅读
- php - MySQL - 从 5.7 迁移到 8 问题,将“function”更改为“job_title”
- r - R:减少分位数回归结果中的图数
- javascript - 如何在不使用 setState 的情况下显示 react-redux 状态值?
- qt - 如何在 Qt 3D 中将法线贴图添加到材质?
- amazon-web-services - 如何将 AWS S3 REST API ListObjects(v2) 与多个父/子存储桶目录一起使用?
- android - 如果我的测试目录下的 widget_test.dart 文件显示错误,有什么问题吗?
- batch-file - 批处理循环并删除某些文件夹
- php - 在 Laravel 8 上更改公用文件夹
- python - 有什么更好的方法可以将列添加到 pandas.Series?
- javascript - 向多个 socketIds (socket.io) 发送数据,以及一点解释