Referencia: Validación
Importa todos los decoradores desde @wabot-dev/framework.
Decoradores de tipo
Verifican que el valor sea del tipo esperado. Requerido en toda propiedad validada.
| Decorador | Tipo TypeScript | Notas |
|---|---|---|
@isString() | string | |
@isNumber() | number | |
@isBoolean() | boolean | |
@isDate() | Date | Convierte strings ISO y timestamps numéricos a Date. |
@isArray(options?) | any[] | Ver opciones abajo. |
@isModel(Clase) | instancia de Clase | Valida un objeto anidado usando los validadores de Clase. |
@isArray(options?)
| Opción | Tipo | Descripción |
|---|---|---|
item | decoradores de tipo | Tipo de cada elemento del array. |
min | number | Longitud mínima del array. |
max | number | Longitud máxima del array. |
// Array de strings@isArray({ item: isString() })tags: string[] = []
// Array de objetos validados@isArray({ item: isModel(DireccionReq), min: 1 })direcciones: DireccionReq[] = []Decoradores de presencia
Controlan si un valor puede ser null, undefined o vacío.
| Decorador | Comportamiento |
|---|---|
@isPresent() | Falla si el valor es null o undefined. |
@isNotEmpty() | Falla si el valor es string vacío '' o array vacío []. |
@isOptional() | Si el valor es null o undefined, omite todos los demás validadores. |
@isOptional()debe ser el primer decorador de la propiedad (se evalúa antes que el resto).
@isString()@isPresent()@isNotEmpty()nombre: string = '' // requerido, no vacío
@isString()@isOptional()apodo: string = '' // puede omitirse; si viene, debe ser stringDecoradores de rango
| Decorador | Aplica a | Descripción |
|---|---|---|
@min(n) | number | Valor mínimo (inclusive). |
@max(n) | number | Valor máximo (inclusive). |
@isIn([...]) | string | number | El valor debe estar en el array de opciones. |
@isNumber()@min(1)@max(100)descuento: number = 0
@isString()@isIn(['pendiente', 'activo', 'cerrado'])estado: string = ''Ejemplo completo
import { isString, isNumber, isBoolean, isDate, isArray, isModel, isPresent, isNotEmpty, isOptional, min, max, isIn} from '@wabot-dev/framework'
export class DireccionReq { @isString() @isNotEmpty() calle: string = ''
@isString() @isNotEmpty() ciudad: string = ''
@isString() @isOptional() codigoPostal: string = ''}
export class CrearClienteReq { @isString() @isNotEmpty() nombre: string = ''
@isString() @isOptional() email: string = ''
@isNumber() @min(18) @max(120) edad: number = 0
@isString() @isIn(['activo', 'inactivo']) estado: string = 'activo'
@isBoolean() aceptaMarketing: boolean = false
@isDate() @isOptional() fechaNacimiento: Date = new Date()
@isArray({ item: isModel(DireccionReq), min: 1 }) direcciones: DireccionReq[] = []}Mapper
Servicio inyectable que combina validación, transformación de tipos y copia profunda. Ideal para convertir datos de entrada (request body, eventos) en objetos tipados.
import { Mapper, injectable } from '@wabot-dev/framework'
@injectable()export class ProductoService { constructor(private mapper: Mapper) {}
async crear(body: unknown) { const req = this.mapper.map(body, CrearProductoReq) // req está tipado y validado // @isDate() ya convirtió strings ISO a Date // Lanza error con detalles si hay errores de validación }}mapper.map(data, Clase)
Valida data contra Clase y retorna la instancia tipada. Lanza CustomError (HTTP 400) si la validación falla.
validateAndTransform(data, Clase)
Función de bajo nivel. Retorna { value, error } sin lanzar excepciones.
import { validateAndTransform } from '@wabot-dev/framework'
const { value, error } = validateAndTransform(body, CrearProductoReq)if (error) { console.error(error.description)} else { // value: CrearProductoReq}