javascript中是否有特定类型数组的类型?

时间:2017-12-23 19:32:05

标签: javascript arrays object types

如果你想创建一些像这样的自定义对象:

{
    list: [],
    type: [String] || Array<String>
}

这样我可以像var.type == Array<String> || var.type == [String]一样进行类型检查吗?

3 个答案:

答案 0 :(得分:0)

虽然如果你需要类型安全,我建议使用typescript,如果必须使用JS,你可以创建一个函数来检查数组。

我们可以检查该项是否为数组,并且每个元素都是string类型。

&#13;
&#13;
let strArr = ["A", "B", "C"];
let numArr = [1, 2, 3];

function isString(val) {
  return (typeof val === "string");
}

function isStrArray(val) {
  return Array.isArray(val) && val.every(isString);
}

console.log("String array", isStrArray(strArr));
console.log("String array", isStrArray(numArr));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

以下是我提出的内容(您为第一个参数传递数组,并将要检查数组项的类型作为第二个参数传递,它应该适用于大多数对象):

var checkArrayType = function checkArrayType (arr, type) {
  
  if(!Array.isArray(arr)) {
    throw new Error('The argument "arr" must be an array!');
  }
  else if(type !== null && type !== undefined && typeof type != 'function') {
    throw new Error('The argument "type" must be a function, "null", or "undefined"!');
  }
  
  // 'null' and 'undefined' require a different check than the main one
  if(type === null || type === undefined) {
    return arr.every(function(e){
      return e === type;
    });
  }
  
  return arr.every(function(e){
    /* 
     * not using 'instanceof' because it would return 'true'
     * for cases like 'subObj instanceof Object'. 
     * ---------------------------------
     * using 'Object(e)' so that the check works for primitives, see:
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
     */
    return Object.getPrototypeOf(Object(e)) === type.prototype;
  });
  
};


console.log(checkArrayType([1,2,3,4], Number)); // true
console.log(checkArrayType(['hello', 10], String)); // false
console.log(checkArrayType([[1, 2.5], ['a', 'b']], Array)); // true
console.log(checkArrayType([null, null, null, null], null)); // true
console.log(checkArrayType([new String('hello'), new String('world')], Object)); // false

var Foo = function Foo(){};
console.log(checkArrayType([new Foo(), new Foo()], Foo)); // true

console.log(checkArrayType({a: null}, null)); // throws error
console.log(checkArrayType([], 'abc')); // throws error

顺便说一下,如果有人可以帮助我完成.every内的长评,那将会很棒,你会如何处理解释2个不同概念的评论(不为{{1}制作单独的变量})?

答案 2 :(得分:-3)

可能的答案?

你可以type: [String]然后在检查类型时

if(var.type.constructor == Array){
    if(var.type[0] && var.type[0] == String){
        // type == [String]
    } else () {
        // check other types
    }
}