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

Sea*_*ron 64 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"
    }
};
Run Code Online (Sandbox Code Playgroud)

TypeScript.io在这里:http://typescript.io/k0ZiJzso0Qg/2

编辑:我已经更新了文本,要求测试string [].这只是在之前的代码示例中.

bas*_*rat 135

您无法string[]在一般情况下进行测试,但您可以Array像在JavaScript中一样轻松地进行测试/sf/answers/53724471/

如果您特别想要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[]!');
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 跨帧检查数组时,“instanceof Array”失败。更喜欢“Array.isArray”:https://twitter.com/mgechev/status/1292709820873748480 (3认同)

gri*_*son 44

另一个选项是Array.isArray()

if(! Array.isArray(classNames) ){
    classNames = [classNames]
}
Run Code Online (Sandbox Code Playgroud)

  • 是的 然后,您需要进行另一项检查。Array.isArray(classNames)&& classNames.every(它=>类型==='字符串') (3认同)
  • 但这不会检查元素是否为字符串类型。 (2认同)

axm*_*rnv 14

这是迄今为止最简洁的解决方案:

function isArrayOfStrings(value: any): boolean {
   return Array.isArray(value) && value.every(item => typeof item === "string");
}
Run Code Online (Sandbox Code Playgroud)

请注意,value.every将返回true一个空数组.如果需要返回false一个空数组,则应该添加value.length条件子句:

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

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


Tca*_*chy 5

尝试这个:

if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}
Run Code Online (Sandbox Code Playgroud)

  • 不要复制另一个答案,请仅指出重复作为评论,特别是因为这并不适用于所有情况。 (7认同)

Nic*_*oll 5

我知道已经解决了这个问题,但是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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • forEach中的return false无效。 (8认同)

Sud*_*nda 5

您可以使用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
Run Code Online (Sandbox Code Playgroud)

我相信这种方法比其他方法更好。这就是我发布这个答案的原因。

塞巴斯蒂安·维特索 (Sebastian Vittersø) 评论的更新

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

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