如果你想创建一些像这样的自定义对象:
{
list: [],
type: [String] || Array<String>
}
这样我可以像var.type == Array<String> || var.type == [String]
一样进行类型检查吗?
答案 0 :(得分:0)
虽然如果你需要类型安全,我建议使用typescript,如果必须使用JS,你可以创建一个函数来检查数组。
我们可以检查该项是否为数组,并且每个元素都是string类型。
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;
答案 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
}
}