diff --git a/types/array.js b/types/array.js index 3ef2729..17c9a27 100644 --- a/types/array.js +++ b/types/array.js @@ -1,5 +1,6 @@ const Base = require('./base.js') const util = require('util') +const validate = require('../validate.js') class TypeArray extends Base { constructor () { @@ -8,6 +9,10 @@ class TypeArray extends Base { this._empty = false this._min = null this._max = null + /** + * @type {Base[]} + */ + this._itemTypes = [] } /** @@ -30,6 +35,11 @@ class TypeArray extends Base { return this } + items (...args) { + this._itemTypes.push(...args) + return this + } + /** * set max length * @param {number} num @@ -50,6 +60,23 @@ class TypeArray extends Base { if (!this._empty && value.length === 0) return `not allow empty` if (this._min !== null && value.length < this._min) return `value length < ${this._min}` if (this._max !== null && value.length > this._max) return `value length > ${this._max}` + + for (const item of value) { + let verified = false + let fail = '' + for (const type of this._itemTypes) { + const result = type.validate(item) + if (result) { + fail = result + } else { + verified = true + fail = '' + break + } + } + if (!verified || fail) return fail || `item type not match` + } + return null } } diff --git a/types/array.test.js b/types/array.test.js index 003a9f7..7778a15 100644 --- a/types/array.test.js +++ b/types/array.test.js @@ -1,5 +1,7 @@ /* eslint-disable no-undef */ const TypeArray = require('./array.js') +const TypeString = require('./string.js') +const TypeObject = require('./object.js') describe('test validate schema type array', () => { function throwFunc (val) { @@ -59,4 +61,15 @@ describe('test validate schema type array', () => { expect(throwFunc(arr.validate([1, 2, 3]))).toThrow() }) + + it('test array contains value', async () => { + const arr = new TypeArray().items(new TypeString()) + + expect(throwFunc(arr.validate([1, 2, 3]))).toThrow() + throwFunc(arr.validate(['asd'])) + + const arr2 = new TypeArray().items(new TypeString(), new TypeObject()) + expect(throwFunc(arr2.validate([123, true]))).toThrow() + throwFunc(arr2.validate(['asd', '33', {}])) + }) })