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

时间:2014-04-17 10:11:30

标签: typescript

如何在TypeScript中测试变量是否为字符串数组?像这样:

function f(): string {
    var a: string[] = ["A", "B", "C"];

    if (typeof a === "string[]")    {
        return "Yes"
    }
    else {
        // returns no as it's 'object'
        return "No"
    }
};

TypeScript.io:http://typescript.io/k0ZiJzso0Qg/2

编辑:我已更新文字以要求测试字符串[]。这只是在之前的代码示例中。

7 个答案:

答案 0 :(得分:118)

您无法在一般情况下测试string[],但您可以非常轻松地测试Arrayhttps://stackoverflow.com/a/767492/390330

相同

如果您特别想要string数组,可以执行以下操作:

if (value instanceof Array) {
   var somethingIsNotString = false;
   value.forEach(function(item){
      if(typeof item !== 'string'){
         somethingIsNotString = true;
      }
   })
   if(!somethingIsNotString && value.length > 0){
      console.log('string[]!');
   }
}

答案 1 :(得分:38)

另一个选项是Array.isArray()

from pyspark.sql.functions import current_timestamp

spark.range(0, 2).select(current_timestamp())

答案 2 :(得分:7)

到目前为止,这是最简洁的解决方案:

function isArrayOfString(value: any): boolean {
   return Array.isArray(value) && value.every(item => typeof item === "string")
}

请注意,对于空数组,value.every将返回true。如果需要为空数组返回false,则应将!!value.length添加到条件子句中:

function isNonEmptyArrayOfStrings(value: any): boolean {
    return Array.isArray(value) && !!value.length && value.every(item => typeof item === "string");
}

由于在运行时没有类型信息,因此无法检查空数组的类型。

答案 3 :(得分:4)

我知道这已经得到解答,但TypeScript引入了类型保护:https://www.typescriptlang.org/docs/handbook/advanced-types.html#typeof-type-guards

如果您的类型如下:Object[] | string[]以及根据其类型有条件地执行某些操作 - 您可以使用此类型防护:

function isStringArray(value: any): value is string[] {
  if (value instanceof Array) {
    value.forEach(function(item) { // maybe only check first value?
      if (typeof item !== 'string') {
        return false
      }
    })
    return true
  }
  return false
}

function join<T>(value: string[] | T[]) {
  if (isStringArray(value)) {
    return value.join(',') // value is string[] here
  } else {
    return value.map((x) => x.toString()).join(',') // value is T[] here
  }
}

将空数组输入为string[]时出现问题,但这可能没问题

答案 4 :(得分:4)

您可以使用Array.prototype.some()轻松地进行操作,如下所示。

const isStringArray = (test: any[]): boolean => {
 return Array.isArray(test) && !test.some((value) => typeof value !== 'string')
}
const myArray = ["A", "B", "C"]
console.log(isStringArray(myArray)) // will be log true if string array

我认为这种方法比其他方法更好。这就是为什么我发布此答案的原因。

有关塞巴斯蒂安·维特瑟(SebastianVittersø)评论的更新

在这里您也可以使用Array.prototype.every()

const isStringArray = (test: any[]): boolean => {
 return Array.isArray(test) && test.every((value) => typeof value === 'string')
}

答案 5 :(得分:1)

试试这个:

if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}

答案 6 :(得分:0)

这里有一点问题,因为

if (typeof item !== 'string') {
    return false
}

不会阻止foreach。 因此,即使数组不包含任何字符串值,函数也将返回true。

这似乎适合我:

function isStringArray(value: any): value is number[] {
  if (Object.prototype.toString.call(value) === '[object Array]') {
     if (value.length < 1) {
       return false;
     } else {
       return value.every((d: any) => typeof d === 'string');
     }
  }
  return false;
}

问候,汉斯