在TypeScript中测试字符串类型的数组。
在TypeScript中测试字符串类型的数组。
在 TypeScript 中,如何测试一个变量是否为字符串数组?类似于这样的操作:
function f(): string { var a: string[] = ["A", "B", "C"]; if (Array.isArray(a) && a.every((item) => typeof item === "string")) { return "是的"; } else { // 返回 "否",因为它是 'object' return "否"; } };
这里有一个 TypeScript.io 的链接:http://typescript.io/k0ZiJzso0Qg/2
编辑:我已更新文本,要求进行字符串数组的测试。之前的示例中只有代码部分。
文章标题:TypeScript中数组字符串类型的测试及解决方法
在TypeScript中,我们经常遇到需要对数组字符串类型进行测试的情况。本文将介绍这个问题的出现原因以及解决方法。
当我们需要对数组字符串类型进行测试时,一种常见的方法是使用Array.isArray()函数。但是这种方法并不能检查数组中的元素是否为字符串类型。为了解决这个问题,我们可以使用以下代码进行额外的检查:
if (!Array.isArray(classNames)) { classNames = [classNames]; }
上述代码首先判断classNames是否为数组类型,如果不是,则将其转换为包含classNames的数组。然而,这仅仅解决了数组类型的问题,并没有检查数组中的元素类型是否为字符串。
为了解决元素类型的问题,我们可以使用以下代码:
Array.isArray(classNames) && classNames.every(it => typeof it === 'string')
上述代码首先判断classNames是否为数组类型,然后使用every()方法对数组中的每个元素进行检查,判断其类型是否为字符串。这样一来,就解决了数组中元素类型的问题。
但是,在实际应用中,当需要检查400多个结果时,性能可能会成为一个问题。所以我们需要考虑是否应该忽略这种类型检查,只检查第一个子元素,或者使用every()方法是否安全。
关于性能问题,我们可以参考stackoverflow上的一个回答,链接如下:asmironov's answer。在该回答中,我们可以找到关于性能问题的更多讨论和解决方法。
总结起来,在TypeScript中对数组字符串类型进行测试时,我们可以使用Array.isArray()函数进行数组类型的检查,并使用every()方法对数组中的元素类型进行检查。但是在实际应用中,我们需要考虑性能问题,并根据具体情况选择合适的解决方法。
在TypeScript中,无法直接测试一个数组是否为string[]
类型,但可以很容易地测试一个数组是否为Array
类型,就像在JavaScript中一样,可以使用Array.isArray(value)
来判断。如果你特别想测试一个string
类型的数组,可以使用以下方法:
if (Array.isArray(value)) { var somethingIsNotString = false; value.forEach(function(item){ if(typeof item !== 'string'){ somethingIsNotString = true; } }) if(!somethingIsNotString && value.length > 0){ console.log('string[]!'); } }
如果你需要检查一个类的数组(不是基本类型的数组):
if(items && (items.length > 0) && (items[0] instanceof MyClassName))
如果你不确定所有的元素是否是相同的类型:
items.every(it => it instanceof MyClassName)
需要注意的是,instanceof Array
在检查跨框架的数组时会失败,推荐使用Array.isArray
,具体原因可以参考这篇推文:twitter.com/mgechev/status/1292709820873748480。
另外,你也可以在判断出存在非字符串元素后立即跳出循环,这样就不需要遍历整个数组了。可以使用value.some()
来实现,但这个回答只涉及如何确定数组/非数组,而不是其他方面的内容。
问题的出现原因是在TypeScript中,无法在运行时获取空数组的元素类型。对于非空数组,只能逐个检查其元素的类型。
解决方法是使用类型谓词value is string[]
将value
的类型缩小为string[]
。这是TypeScript的一个特性,函数的实际返回类型是boolean
。
如果数组为空,需要检查value.length > 0
而不仅仅是value.length
,因为后者会返回0,而0在JS/TS中被解释为false
。
在JS中,&&
运算符会进行短路计算。对于每个&&
链中的表达式,如果它是真值,则继续下一个表达式。但如果它是假值,则直接返回。只有当所有条件都被耗尽时,才返回true
。可以使用双感叹号!!value.length
将真值强制转换为布尔值。
另一种解决方法是使用"is string[]"
作为类型谓词。
参考链接:
- TypeScript Design Goals > Non goals