рдирд┐рд░реНрдорд╛рдг рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдореБрд▓рд╛рдХрд╛рдд рдХреА рдЧрдИ рдЬрд╣рд╛рдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВ рдЬреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛:


  • рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ ;
  • рдЕрдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рдпрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ;
  • рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдпрд╛ рд╕рд░рдгреА рдХреЗ рдЕрдорд╛рдиреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ ;
  • рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдЬрд┐рд╕рдХрд╛ рдЖрдзрд╛рд░ рд╣реЛрдЧрд╛:


  • рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ
  • рдкреНрд░рд╛рдкреНрдд рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ред
  • рдХреЛрдб рд╕рдВрд╢реЛрдзрди рдореЗрдВ рдЖрд╕рд╛рдиреА

рдЗрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪреМрдХрдбрд╝реА рдорд╛рдиреНрдпрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдореВрд▓ рдорд╛рдиреНрдпрддрд╛ рдИрдВрдЯреЗрдВ


рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рджрд┐рд▓ рдореЗрдВ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрддреНрд╡ рд╣реИрдВ : рдХреНрд░рд┐рдпрд╛рдПрдВ, рдбреЗрдЯрд╛ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдоред рд╕рд╛рде рд╣реА рдЙрдирдХреА рд░рдЪрдирд╛ рдХреЗ рддрд░реАрдХреЗ - рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рддрддреНрд╡реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛


рдЪреМрдХрдбрд╝реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ


function validator( value: any, { key: string|int, parent: any }, { key: string|int, parent: any }, ... ): boolean 

рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХрдИ рдмрд╛рддреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


function(...): boolean - рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ - рд╕рддреНрдпрд╛рдкрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдмреБрд▓рд┐рдпрди рдореВрд▓реНрдп рд╣реИ - рд╕рд╣реА рдпрд╛ рдЧрд▓рдд , рдХреНрд░рдорд╢рдГ рдорд╛рдиреНрдп рдпрд╛ рдорд╛рдиреНрдп рдирд╣реАрдВ


value: any - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ - рдПрдХ рдореВрд▓реНрдп рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдпрд╛ рддреЛ рдорд╛рдиреНрдп рдореВрд▓реНрдп рдХреЛ рд╡реИрдз рдпрд╛ рдЕрдорд╛рдиреНрдп рдмрддрд╛рддрд╛ рд╣реИред


{ key: string|int, parent: any }, ... - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реИрд▓реНрдпреВрдб рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд╕реНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реЗрд░рд┐рдлрд╛рдЗрдб рд╡реИрд▓реНрдпреВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдПрдВ


рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореВрд▓реНрдп


 const value = 4; //         . //         : const isValueValid = validator(4) 

рдПрдХ рд╕рд░рдгреА рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдореВрд▓реНрдп


 //  0 1 2 3 4 const arr = [1, 2, 3, value, 5] //       (k): 3 //      : [1, 2, 3, value, 5] //    value -      const isValueValid = validator(4, { key: 3, parent: [1,2,3,4,5] }) 

рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдореВрд▓реНрдп


 const obj = { a: 1, b: 2, c: value, d: 8 } //        'c' //       : { a: 1, b: 2, c: 4, d: 8 } //    value -   //   : const isValueValid = validator(4, { key: 'c', parent: { a: 1, b: 2, c: 4, d: 8 } }) 

рдЪреВрдВрдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ


 const arrOfObj = [{ a: 1, b: 2, c: value, d: 8 }, // ... ] //   c     'c' //    : { a: 1, b: 2, c: 4, d: 8 } //        arrOfObj, //       0. //    value -      const isValueValid = validator( 4, { key: 'c', parent: { a: 1, b: 2, c: 4, d: 8 } } { key: 0, parent: [{ a: 1, b: 2, c: 4, d: 8 }] } ) 

рдФрд░ рдЗрд╕реА рддрд░рд╣ред


рд╕рд░рдгреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреА рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдЖрдкрдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рд░рдгреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ: рдирдХреНрд╢рд╛, рдлрд╝рд┐рд▓реНрдЯрд░, рдХреБрдЫ, рд╣рд░ , рдЖрджрд┐ред


  • рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рддрд░реНрдХ рдПрдХ рд╕рд░рдгреА рддрддреНрд╡ рд╣реИред
  • рджреВрд╕рд░рд╛ рддрд░реНрдХ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред
  • рддреАрд╕рд░рд╛ рддрд░реНрдХ рд╕реНрд╡рдпрдВ рд╕рд░рдгреА рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд╛рд░реНрдп рд╣реИ - рдпрд╣ рди рдХреЗрд╡рд▓ рд╕рд░рдгреА рдФрд░ рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд░рдгреА рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рднреА рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред


рд╣рдореЗрдВ рдХреНрдпрд╛ рдШрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдИрдВрдЯреЗрдВ рдЕрдиреНрдп "рдкрддреНрдерд░ рдХреЗ рд╕рдорд╛рдзрд╛рди" рдХреЗ рдмреАрдЪ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЦрдбрд╝реА рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреИрд╕рд╛рдЦреА "рд╕рдореБрджреНрд░ рддрдЯ" рдкрд░ рдЭреВрда рдмреЛрд▓ рд░рд╣реА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рдЙрдирд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рдХреБрдЫ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рдФрд░ рджрд┐рд▓рдЪрд╕реНрдкред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░рдЪрдирд╛ рд╣реИ ред


рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдЧрдЧрдирдЪреБрдВрдмреА рдЗрдорд╛рд░рдд рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ?


рд╕рд╣рдордд рд╣реЛрдирд╛, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рд╡рд┐рд╡рд░рдг рд╡рд╕реНрддреБ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 //    quartet const quartet = require('quartet') //    (v -  validator) const v = quartet() //      , //     const objectSchema = { a: a => typeof a ==='string', //   'string' b: b => typeof b === 'number', //   'number' // ... } const compositeObjValidator = v(objectSchema) const obj = { a: 'some text', b: 2 } const isObjValid = compositeObjValidator(obj) console.log(isObjValid) // => true 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рднрд┐рдиреНрди рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдИрдВрдЯреЛрдВ рд╕реЗ, рд╣рдо рдПрдХ рд╡рд╕реНрддреБ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреБрдЫ "рдЫреЛрдЯреА рдЗрдорд╛рд░рдд" рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЕрднреА рднреА рдХрд╛рдлреА рддрдВрдЧ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ v рдХреЗ рдХрдВрдкреЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░, рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ v рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред


рдХрднреА-рдХрднреА рд╣рдо рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХреЛрдИ рд╡рд╕реНрддреБ рдбреЗрдЯрд╛ рдбрд┐рдХреНрд╢рдирд░реА рд╣реЛрддреА рд╣реИ:


 const quartet = require('quartet') const v = quartet() const isStringValidator = name => typeof name === 'string' const keyValueValidator = (value, { key }) => value.length === 1 && key.length === 1 const dictionarySchema= { dictionaryName: isStringValidator, ...v.rest(keyValueValidator) } const compositeObjValidator = v(dictionarySchema) const obj = { dictionaryName: 'next letter', b: 'c', c: 'd' } const isObjValid = compositeObjValidator(obj) console.log(isObjValid) // => true const obj2 = { dictionaryName: 'next letter', b: 'a', a: 'invalid value', notValidKey: 'a' } const isObj2Valid = compositeObjValidator(obj2) console.log(isObj2Valid) // => false 

рдирд┐рд░реНрдорд╛рдг рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рджреЗрдЦрд╛, рд╕рд░рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛" рдХрд╛ рджреЛ рдмрд╛рд░ рдкрд╣рд▓реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред


рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреА рдкрдардиреАрдпрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪреМрдХрдбрд╝реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬрдм рднреА рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╕рдВрдЧреАрддрдХрд╛рд░ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдЦреЛрдЬрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рдмрд╕реЗ рдЖрдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 v('number')(1) // => true v('number')('1') // => false v('string')('1') // => true v('string')(null) // => false v('null')(null) // => true v('object')(null) // => true v('object!')(null) // => false // ... 

рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрдИ рдЕрдиреНрдпред


рдкреНрд░рддреНрдпреЗрдХ рдЖрд░реНрдХ рдореЗрдВ рдИрдВрдЯреЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ?


рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╕рдВрдЧреАрддрдХрд╛рд░ (рдлрд╝рдВрдХреНрд╢рди v ) рднреА рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИрдВ


  • рдлрд╝рдВрдХреНрд╢рди рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛
  • рд╡реИрд▓реНрдпреВрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреЛрдЬрд╝рд░ рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдорд╛рдиреЗрдВрдЧреЗ, рд╡реЗ рдорд╛рди

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд░рдгреА рд╕рддреНрдпрд╛рдкрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ: рдмрд╣реБрдзрд╛ рдЗрд╕рдореЗрдВ рд╕рд░рдгреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП v.arrayOf(elementValidator) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд▓реЗрдВред


  const a = [ {x: 1, y: 1, name: 'A'}, {x: 2, y: 1, name: 'B'}, {x: -1, y: 2, name: 'C'}, {x: 1, y: 3, name: 'D'}, ] 

рдЪреВрдВрдХрд┐ рдЕрдВрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред


 const namedPointSchema = { x: 'number', // number -       y: 'number', name: 'string' // string -       } 

рдЕрдм, рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб v.arrayOf рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреВрд░реЗ рдРрд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ v.arrayOf рдмрдирд╛рдПрдБ


 const isArrayValid = v.arrayOf({ x: 'number', y: 'number', name: 'string' }) 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 isArrayValid(0) // => false isArrayValid(null) // => false isArrayValid([]) // => true isArrayValid([1, 2, 3]) // => false isArrayValid([ {x: 1, y: 1, name: 'A'}, {x: 2, y: 1, name: 'B'}, {x: -1, y: 2, name: 'C'}, {x: 1, y: 3, name: 'D'}, ]) // => true 

рдпрд╣ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдКрдкрд░ рджреЗрдЦрд╛, v.rest рднреА рдПрдХ рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ v.rest рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ v.rest рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рдлреАрд▓реНрдбреНрд╕ рдХреЛ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕реЗ spread-operator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдЪрдирд╛ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЖрдЗрдП рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:


 //    quartet const quartet = require('quartet') //    (v -  validator) const v = quartet() //   ,    const max = { name: 'Maxim', sex: 'male', age: 34, status: 'grandpa', friends: [ { name: 'Dima', friendDuration: '1 year'}, { name: 'Semen', friendDuration: '3 months'} ], workExperience: 2 } //  ,   "" , // ""  , ""   -  const nameSchema = v.and( 'not-empty', 'string', //   name => name[0].toUpperCase() === name[0] // - ) const maxSchema = { name: nameSchema, //       sex: v.enum('male', 'female'), //  -   . //       "" age: v.and('non-negative', 'safe-integer'), status: v.enum('grandpa', 'non-grandpa'), friends: v.arrayOf({ name: nameSchema, //      friendDuration: v.regex(/^[1-9]\d? (years?|months?)$/) }), workExperience: v.and('non-negative', 'safe-integer') } console.log(v(maxSchema)(max)) // => true 

рд╣реЛрдирд╛ рд╣реИ, рдпрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рд╣реИ?


рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡реИрдз рдбреЗрдЯрд╛ рд╡рд┐рднрд┐рдиреНрди рд░реВрдк рд▓реЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


  • id рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред
  • рдЖрдпрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ point рд╡рд╕реНрддреБ рдореЗрдВ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
  • рдФрд░ рдХрдИ рдЕрдиреНрдп рдорд╛рдорд▓реЗред

рд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рд░рдЪрдирд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ - рднрд┐рдиреНрди рд░рдЪрдирд╛ред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рддрдм рд╡реИрдз рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡реИрдз рдЙрд╕рдХреА рд╡реИрдзрддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред


рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


  const isValidId = v([ v.and('not-empty', 'string'), //       v.and('positive', 'safe-integer') //    ]) isValidId('') // => false isValidId('asdba32bas321ab321adb321abds546ba98s7') // => true isValidId(0) // => false isValidId(1) // => true isValidId(1123124) // => true 

рдмрд┐рдВрджреБ рд╕рддреНрдпрд╛рдкрди рдЙрджрд╛рд╣рд░рдг:


 const isPointValid = v([ { //    -    x  dimension: v.enum(1), x: 'number', // v.rest    false // ,    -  ...v.rest(() => false) }, //   -    { dimension: v.enum(2), x: 'number', y: 'number', ...v.rest(() => false) }, //   - x, y  z { dimension: v.enum(3), x: 'number', y: 'number', z: 'number', ...v.rest(() => false) }, ]) // ,    ,      ,     -  -    isPointValid(1) // => false isPointValid(null) // => false isPointValid({ dimension: 1, x: 2 }) // => true isPointValid({ dimension: 1, x: 2, y: 3 //   }) // => false isPointValid({ dimension: 2, x: 2, y: 3 }) // => true isPointValid({ dimension: 3, x: 2, y: 3, z: 4 }) // => true // ... 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рднреА рдХреЛрдИ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕реЗ рдЗрд╕ рд╕рд░рдгреА рдХреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд░рдЪрдирд╛ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдорд╛рди рдХреЛ рд╡реИрдз рдорд╛рдирддрд╛ рд╣реИ, рддреЛ рд╕рддреНрдпрд╛рдкрди рдХреА рдЧрдгрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдорд╛рди рдХреЛ рдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рдВрдЧреАрддрдХрд╛рд░ рди рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдорд╛рдирддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд╣ рд╕рдм рдХреБрдЫ рднреА рд╣реИ рдЬреЛ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред


рд╡реИрдз рдкреНрд░рдХрд╛рд░рдЙрджрд╛рд╣рд░рдгрдЬреИрд╕рд╛ рдХрд┐ рд╕рдВрдЧреАрддрдХрд╛рд░ рдиреЗ рдорд╛рдирд╛ рд╣реИ
рд╕рддреНрдпрд╛рдкрди рд╕рдорд╛рд░реЛрд╣x => typeof x === 'bigint'рдмрд╕ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
рд╡рд╕реНрддреБ рд░рдЪрдирд╛{ a: 'number' }рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ
рднрд┐рдиреНрди рд░рдЪрдирд╛['number', 'string']рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ
рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдХреЙрд▓ рдкрд░рд┐рдгрд╛рдоv.enum('male', 'female')рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп v.rest ( v.rest рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдЬреЛ рд╡рд╕реНрддреБ рд╕рдВрд░рдЪрдирд╛ рд▓реМрдЯрд╛рддреА рд╣реИ), рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ

рдпреЗ рд╕рднреА рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рд╡реИрдз рд╣реИрдВ рдФрд░ рд╕реНрдХреАрдорд╛ рдХреЗ рднреАрддрд░ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдирддреАрдЬрддрди, рдСрдкрд░реЗрд╢рди рдпреЛрдЬрдирд╛ рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрд░рд╣ рд╣реЛрддреА рд╣реИ: v(schema) рдПрдХ рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
v(schema)(value[, ...parents])


рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рд░реНрдорд╛рдг рд╕реНрдерд▓ рдкрд░ рдХреЛрдИ рджреБрд░реНрдШрдЯрдирд╛ рд╣реБрдИ рд╣реИ?


- рдЕрднреА рдирд╣реАрдВ, рдПрдХ рдирд╣реАрдВ
- рд╡реЗ!


рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЕрдорд╛рдиреНрдп рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрдорд╛рдиреНрдп рдХрд╛ рдХрд╛рд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЪреМрдХрдбрд╝реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдЬрдм рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛, рдЪрд╛рд╣реЗ рдЖрдВрддрд░рд┐рдХ рдпрд╛ рдмрд╛рд╣рд░реА, рд╕рддреНрдпрд╛рдкрд┐рдд рдбреЗрдЯрд╛ рдХреА рд╡реИрдзрддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдиреЛрдЯ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред


рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ v рдХреЗ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХрд╛ v ред рдпрд╣ рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ v.explanation рд╕рд░рдгреА рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдиреЛрдЯ рднреЗрдЬрдиреЗ рдХрд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдЬреЛрдбрд╝рддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг, рд╣рдореЗрдВ рдПрдХ рдРрд░реЗ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдорд╛рдиреНрдп рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдореВрд▓реНрдп рд╣реИ:


  //   -     //   const getExplanation = (value, { key: index }) => ({ invalidValue: value, index }) // ,       . //         v.explanation //    const arrValidator = v.arrayOf( v( 'number', //   getExplanation //   "",   "" ) ) // ,     ""  //     ,     //         //   ,       const explainableArrValidator = v(arrValidator, 'this array is not valid') const arr = [1, 2, 3, 4, '5', '6', 7, '8'] explainableArrValidator(arr) // => false v.explanation // [ // { invalidValue: '5', index: 4 }, // { invalidValue: '6', index: 5 }, // { invalidValue: '8', index: 7 }, // 'this array is not valid' // ] 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдХрд╛рд░реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдЕрдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:


 const objSchema = { a: v('number', 'a'), b: v('number', 'b'), c: v('string', 'c') } const isObjValid = v(objSchema) let invalidObj = { a: 1, b: '1', c: 3 } isObjValid(invalidObj) // => false v.explanation // ['b', 'c'] //     console.error(`${v.explanation.join(', ')} is not valid`) // => b, c is not valid //       (. ) invalidObj = v.omitInvalidProps(objSchema)(invalidObj) console.log(invalidObj) // => { a: 1 } 

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рд╣реЛрдиреЗ рдкрд░, рдЖрдк рд╕рддреНрдпрд╛рдкрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


  • рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдпреБрдХреНрдд рдПрдХ рд╡рд╕реНрддреБ;
  • рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред ( getExplanation => function(invalid): valid );
  • рдЕрдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо, рдпрд╛ рдЕрдорд╛рдиреНрдп рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ;
  • рддреНрд░реБрдЯрд┐ рдХреЛрдб
  • рдФрд░ рд╡рд╣ рд╕рдм рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдЬрдм рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рдмрди рд░рд╣реА рд╣реЛрдВ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ?


рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдПрдХ рджреБрд░реНрд▓рдн рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╣реИред


  • v.default(validator, value) - рдЕрдорд╛рдиреНрдп рдорд╛рди рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ v.fix рдХреЗ рд╕рдордп - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ
  • v.filter(validator) - рдПрдХ v.filter(validator) рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рди рдХреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ, рдФрд░ v.fix рдХреЗ рд╕рдордп - рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдЗрд╕ рдорд╛рди рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ
  • v.addFix(validator, fixFunc) - рдПрдХ рд╡реИрдз рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдХреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ, рдФрд░ v.fix рдХреЗ рд╕рдордп - рдкреИрд░рд╛рдореАрдЯрд░ (рдорд╛рди, {key, parent}, ...) рдХреЗ рд╕рд╛рде fixFunc рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред fixFunc - рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП - рднрд╛рдЧреАрджрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛

 const toPositive = (negativeValue, { key, parent }) => { parent[key] = -negativeValue } const objSchema = { a: v.default('number', 1), b: v.filter('string', ''), c: v.default('array', []), d: v.default('number', invalidValue => Number(invalidValue)), //    pos: v.and( v.default('number', 0), //     -  0 v.addFix('non-negative', toPositive) //     -   ) } const invalidObj = { a: 1, b: 2, c: 3, d: '4', pos: -3 } v.resetExplanation() //   v() v(objSchema)(invalidObj) // => false // v.hasFixes() => true const validObj = v.fix(invalidObj) console.log(validObj) // => { a: 1, b: '', c: [], d: 4 } 

рдХрд╛рдо рдЕрднреА рднреА рдХрд╛рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВ


рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд┐рдпрд╛рдБ рднреА рд╣реИрдВ:


рд╡рд┐рдзрд┐рдкрд░рд┐рдгрд╛рдо
v.throwErrorрдпрджрд┐ рдЕрдорд╛рдиреНрдп рд╣реИ, рддреЛ рджрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде TypeError рдлреЗрдВрдХрддрд╛ рд╣реИред
v.omitInvalidItemsрдЕрдорд╛рдиреНрдп рддрддреНрд╡реЛрдВ (рдлрд╝реАрд▓реНрдб) рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирдИ рд╕рд░рдгреА (рдпрд╛ рд╢рдмреНрджрдХреЛрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ) рд▓реМрдЯрд╛рддрд╛ рд╣реИред
v.omitInvalidPropsрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
v.validOrрдпрджрд┐ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ, рддреЛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИред
v.exampleрджрд┐рдП рдЧрдП рдорд╛рди рд╕реНрдХреАрдорд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИред рдпрджрд┐ рд╡реЗ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╕рд░реНрдХрд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

рдкрд░рд┐рдгрд╛рдо


рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


рдХрд╛рд░реНрдпрдирд┐рд░реНрдгрдп
рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕рддреНрдпрд╛рдкрдирдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиv.default
рдЕрдорд╛рдиреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рд░рд╣рд╛ рд╣реИv.filter , v.omitInvalidItems рдФрд░ v.omitInvalidProps ред
рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИрд╕рд░рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛, рдЬрдЯрд┐рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдЙрдирдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд░рд▓ рддрд░реАрдХреЗред
рдХреЛрдб рдкрдардиреАрдпрддрд╛рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдХрд░рдирд╛ рдерд╛
рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдПрдВред
рд╕рдВрд╢реЛрдзрди рдореЗрдВ рдЖрд╕рд╛рдиреАрд░рдЪрдирд╛рдУрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рдХреЛрдб рдмрджрд▓рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рдпрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдЧрдгрдирд╛ред

рдЕрдВрддрднрд╛рд╖рдг


рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╕реНрдЯрдо рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рд╣реИ, рддреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЛрдВ рд╕реЗ рд╕реБрдзрд╛рд░, рдЖрд▓реЛрдЪрдирд╛, рд╕реБрдзрд╛рд░ рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд╣реИрдВред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi429916/


All Articles