UNPKG

@anpdgovbr/shared-types

Version:

Biblioteca central de tipos TypeScript compartilhados para os projetos da ANPD (BETA)

196 lines 5.87 kB
/** * @fileoverview * Type helpers e utilitários de tipos para trabalhar com entidades do sistema. * * @remarks * Este módulo fornece types utilitários que facilitam a criação de payloads, * extração de campos específicos e manipulação de tipos de entidades. * * @module base/type-helpers * @public */ import type { AuditedEntity } from "./audited-entity.interface"; import type { AuditContext } from "./audit-context.interface"; import type { BaseEntity } from "./base-entity.interface"; import type { SoftDelete } from "./soft-delete.interface"; /** * Extrai apenas os campos de auditoria de uma entidade. * * @template T Tipo da entidade auditável * * @example * ```typescript * const campos: AuditFields<Usuario> = { * criadoEm: new Date(), * atualizadoEm: new Date() * } * ``` */ export type AuditFields = Pick<AuditedEntity, "criadoEm" | "atualizadoEm">; /** * Remove campos de auditoria de uma entidade. * * @template T Tipo da entidade auditável * * @remarks * Útil para criar DTOs de entrada que não devem incluir metadados de auditoria. * * @example * ```typescript * type UsuarioSemAuditoria = WithoutAudit<UsuarioDto> * ``` */ export type WithoutAudit<T extends AuditedEntity> = Omit<T, keyof AuditContext | "criadoEm" | "atualizadoEm">; /** * Remove o campo `id` de uma entidade. * * @template T Tipo da entidade base * * @remarks * Útil para criar tipos de entrada onde o ID ainda não existe (entidade não persistida). * * @example * ```typescript * type UsuarioSemId = WithoutId<UsuarioDto> * ``` */ export type WithoutId<T extends BaseEntity> = Omit<T, "id">; /** * Tipo para payload de criação de entidades auditáveis. * * @template T Tipo da entidade auditável * * @remarks * Remove `id` e todos os campos de auditoria, pois estes são preenchidos automaticamente * pelo sistema ao persistir a entidade. * * @example * ```typescript * const payload: CreatePayload<UsuarioDto> = { * nome: "João Silva", * email: "joao@example.com" * } * ``` */ export type CreatePayload<T extends AuditedEntity> = Omit<T, "id" | keyof AuditContext | "criadoEm" | "atualizadoEm">; /** * Tipo para payload de atualização parcial de entidades auditáveis. * * @template T Tipo da entidade auditável * * @remarks * Mantém o `id` (necessário para identificar qual entidade atualizar) e torna todos os campos * opcionais, exceto os campos de auditoria que são removidos (preenchidos pelo sistema). * * @example * ```typescript * const payload: UpdatePayload<UsuarioDto> = { * id: 1, * nome: "João Silva Atualizado" // outros campos são opcionais * } * ``` */ export type UpdatePayload<T extends AuditedEntity> = Partial<Omit<T, keyof AuditContext | "criadoEm" | "atualizadoEm">> & Pick<T, "id">; /** * Tipo para payload de criação de entidades com soft delete. * * @template T Tipo da entidade com soft delete * * @remarks * Remove campos de controle de soft delete, pois novos registros são criados ativos por padrão. * * @example * ```typescript * const payload: CreatePayloadWithSoftDelete<SetorDto> = { * nome: "TI" * // active e exclusionDate não são necessários * } * ``` */ export type CreatePayloadWithSoftDelete<T extends AuditedEntity & SoftDelete> = Omit<T, "id" | keyof AuditContext | "criadoEm" | "atualizadoEm" | keyof SoftDelete>; /** * Torna todos os campos de um tipo obrigatórios (remove `undefined`). * * @template T Tipo a ser processado * * @remarks * Diferente de `Required<T>` que apenas remove o modificador `?`, este tipo * também remove `undefined` da union de tipos. * * @example * ```typescript * type Config = { url?: string; timeout?: number } * type ConfigCompleta = RequiredFields<Config> * // { url: string; timeout: number } * ``` */ export type RequiredFields<T> = { [P in keyof T]-?: NonNullable<T[P]>; }; /** * Torna campos específicos de um tipo obrigatórios. * * @template T Tipo base * @template K Chaves dos campos a serem tornados obrigatórios * * @example * ```typescript * type Usuario = { id?: string; nome?: string; email?: string } * type UsuarioComId = RequireFields<Usuario, "id"> * // { id: string; nome?: string; email?: string } * ``` */ export type RequireFields<T, K extends keyof T> = T & Required<Pick<T, K>>; /** * Torna campos específicos de um tipo opcionais. * * @template T Tipo base * @template K Chaves dos campos a serem tornados opcionais * * @example * ```typescript * type Usuario = { id: string; nome: string; email: string } * type UsuarioComEmailOpcional = OptionalFields<Usuario, "email"> * // { id: string; nome: string; email?: string } * ``` */ export type OptionalFields<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>; /** * Extrai apenas os campos do tipo Date de uma interface. * * @template T Tipo a ser processado * * @remarks * Útil para validações de data ou transformações de serialização. * * @example * ```typescript * type Usuario = { * id: string * nome: string * criadoEm: Date * atualizadoEm: Date * } * type DatasUsuario = DateFields<Usuario> * // { criadoEm: Date; atualizadoEm: Date } * ``` */ export type DateFields<T> = { [K in keyof T as T[K] extends Date | Date | null | undefined ? K : never]: T[K]; }; /** * Converte todos os campos Date para string (útil para serialização JSON). * * @template T Tipo a ser processado * * @example * ```typescript * type Usuario = { id: string; criadoEm: Date } * type UsuarioSerializado = SerializeDates<Usuario> * // { id: string; criadoEm: string } * ``` */ export type SerializeDates<T> = { [K in keyof T]: T[K] extends Date ? string : T[K] extends Date | null ? string | null : T[K] extends Date | undefined ? string | undefined : T[K]; }; //# sourceMappingURL=type-helpers.d.ts.map