@anpdgovbr/shared-types
Version:
Biblioteca central de tipos TypeScript compartilhados para os projetos da ANPD (BETA)
196 lines • 5.87 kB
TypeScript
/**
* @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