Test for array of string type in TypeScript

后端 未结 7 1979
礼貌的吻别
礼貌的吻别 2020-12-03 02:32

How can I test if a variable is an array of string in TypeScript? Something like this:

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

         


        
相关标签:
7条回答
  • 2020-12-03 02:49

    You cannot test for string[] in the general case but you can test for Array quite easily the same as in JavaScript https://stackoverflow.com/a/767492/390330

    If you specifically want for string array you can do something like:

    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[]!');
       }
    }
    
    0 讨论(0)
  • 2020-12-03 02:50

    Another option is Array.isArray()

    if(! Array.isArray(classNames) ){
        classNames = [classNames]
    }
    
    0 讨论(0)
  • 2020-12-03 02:52

    I know this has been answered, but TypeScript introduced type guards: https://www.typescriptlang.org/docs/handbook/advanced-types.html#typeof-type-guards

    If you have a type like: Object[] | string[] and what to do something conditionally based on what type it is - you can use this type guarding:

    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
      }
    }
    

    There is an issue with an empty array being typed as string[], but that might be okay

    0 讨论(0)
  • 2020-12-03 02:54

    Here is the most concise solution so far:

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

    Note that value.every will return true for an empty array. If you need to return false for an empty array, you should add value.length to the condition clause:

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

    There is no any run-time type information in TypeScript (and there won't be, see TypeScript Design Goals > Non goals, 5), so there is no way to get the type of an empty array. For a non-empty array all you can do is to check the type of its items, one by one.

    0 讨论(0)
  • 2020-12-03 02:54

    You can have do it easily using Array.prototype.some() as below.

    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
    

    I believe this approach is better that others. That is why I am posting this answer.

    Update on Sebastian Vittersø's comment

    Here you can use Array.prototype.every() as well.

    const isStringArray = (test: any[]): boolean => {
     return Array.isArray(test) && test.every((value) => typeof value === 'string')
    }
    
    0 讨论(0)
  • 2020-12-03 02:59

    there is a little problem here because the

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

    will not stop the foreach. So the function will return true even if the array does contain none string values.

    This seems to wok for me:

    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;
    }
    

    Greetings, Hans

    0 讨论(0)
提交回复
热议问题