Skip to content

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.

DecoradorTipo TypeScriptNotas
@isString()string
@isNumber()number
@isBoolean()boolean
@isDate()DateConvierte strings ISO y timestamps numéricos a Date.
@isArray(options?)any[]Ver opciones abajo.
@isModel(Clase)instancia de ClaseValida un objeto anidado usando los validadores de Clase.

@isArray(options?)

OpciónTipoDescripción
itemdecoradores de tipoTipo de cada elemento del array.
minnumberLongitud mínima del array.
maxnumberLongitud 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.

DecoradorComportamiento
@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 string

Decoradores de rango

DecoradorAplica aDescripción
@min(n)numberValor mínimo (inclusive).
@max(n)numberValor máximo (inclusive).
@isIn([...])string | numberEl 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
}