繁体   English   中英

如果可选道具是 TypeScript 中的数组,如何在三元运算符中使用 boolean 赋值

[英]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);

我们知道以下内容:如果isRequestingMultipleDevicestrue ,则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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM