Typescript:将数组类型检查结果传递给变量



我有一段代码,我需要在几个不同的地方知道变量是否是数组(它可以是数组或字符串(。如果是,我会在数据上绘制地图。如果没有,我会做其他事情。

打字脚本抱怨的简化代码:

function myFunc(input: unknown[] | string) {
const isArray = Array.isArray(input);

if (isArray) {
// this line throws an error, since `map` is not a valid method for strings
return input.map(/* do stuff here*/);
}
return input;
}

如果我将带有if语句的行更改为:

if (Array.isArray(input))

那么typescript似乎理解CCD_ 2实际上是一个数组。

不过,我在实际代码中的几个地方使用了这种检查,并且为了可读性,我希望使用单个变量,而不是每次都使用Array.isArray

这是怎么回事?

Typescript 4.4+

你想做的事情在Typescript 4.4中有效(截至2021年7月6日未发布(

请参阅博客文章详细介绍别名条件

使用夜间构建的游乐场


字体4.3

在早期版本的打字脚本中,您的选择有点有限。问题是typescript不够聪明,无法理解const isArray是从Array.isArray(input)派生而来的。在这一行之后,它只是一个布尔值,与任何其他值都没有连接。

如果输入是数组,我可能会创建一个只有值的中间变量。这样,typescript就可以在一个变量上跟踪该类型。

类似于:

function myFunc(input: unknown[] | string) {
const inputArray = Array.isArray(input) ? input : null
if (inputArray) {
return inputArray.map(str => str);
}
return input;
}

游乐场

Array.isArray是一种特殊的检查,用于缩小变量类型。关于这一点有整整一章:https://www.typescriptlang.org/docs/handbook/2/narrowing.html

也许您想使用一对变量,然后在函数中使用它们。

const inputArray = Array.isArray(input) ? input : null;
const inputString = Array.isArray(input) ? null : input;

现在,如果不为null,则可以使用相应的变量。但这只是将一种形式的支票转换为另一种形式,所以IMHO并没有那么有用。

当然,您可以将一个变量用作任何类型,但您将失去所有TS优点。

const inputAny: any = input;

最新更新