在TypeScript中测试字符串类型的数组。

12 浏览
0 Comments

在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

编辑:我已更新文本,要求进行字符串数组的测试。之前的示例中只有代码部分。

0
0 Comments

文章标题: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()方法对数组中的元素类型进行检查。但是在实际应用中,我们需要考虑性能问题,并根据具体情况选择合适的解决方法。

0
0 Comments

在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()来实现,但这个回答只涉及如何确定数组/非数组,而不是其他方面的内容。

0
0 Comments

问题的出现原因是在TypeScript中,无法在运行时获取空数组的元素类型。对于非空数组,只能逐个检查其元素的类型。

解决方法是使用类型谓词value is string[]value的类型缩小为string[]。这是TypeScript的一个特性,函数的实际返回类型是boolean

如果数组为空,需要检查value.length > 0而不仅仅是value.length,因为后者会返回0,而0在JS/TS中被解释为false

在JS中,&&运算符会进行短路计算。对于每个&&链中的表达式,如果它是真值,则继续下一个表达式。但如果它是假值,则直接返回。只有当所有条件都被耗尽时,才返回true。可以使用双感叹号!!value.length将真值强制转换为布尔值。

另一种解决方法是使用"is string[]"作为类型谓词。

参考链接:

- Array.prototype.every()

- Array.prototype.length

- TypeScript Design Goals > Non goals

- TypeScript Handbook - Using Type Predicates

- TypeScript Handbook - Using Type Predicates

0