//
Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Use os tipos utilitários embutidos do TypeScript para transformar e compor tipos de props do React. Derive novos tipos de tipos existentes em vez de duplicar definições.
// Tipo base
type User = {
id: string;
name: string;
email: string;
role: "admin" | "editor" | "viewer";
createdAt: Date;
};
// Partial - todos os campos se tornam opcionais (ótimo para formulários de atualização)
type UpdateUserPayload = Partial<User>;
// Pick - seleciona campos específicos
type UserPreview = Pick<User, "id" | "name">;
// Omit - exclui campos específicos
type CreateUserPayload = Omit<User, "id" | "createdAt">;
// Record - mapa de chave-valor tipado
type RolePermissions = Record<User["role"], string[]>;
const permissions: RolePermissions = {
admin: ["read", "write", "delete"],
editor: ["read", "write"],
viewer: ["read"],
};// Componente prático usando tipos derivados
type UserFormProps = {
initialData?: Partial<User>;
onSubmit: (data: CreateUserPayload) => void;
};
function UserForm({ initialData, onSubmit }: UserFormProps) {
const [form, setForm] = useState<CreateUserPayload>({
name: initialData?.name ?? "",
email: initialData?.email ?? "",
role: initialData?.role ?? "viewer",
});
return (
<form
onSubmit={(e) => {
e.preventDefault();
onSubmit(form);
}}
>
<input
value={form.name}
onChange={(e) => setForm({ ...form, name: e.target.value })}
/>
<input
value={form.email}
onChange={(e) => setForm({ ...form, email: e.target.value })}
/>
<button type="submit">Salvar</button>
</form>
);
}Partial<T>: Torna todas as propriedades em T opcionais. Útil para payloads de atualização onde você muda apenas alguns campos.Required<T>: É o inverso de Partial - torna todas as propriedades obrigatórias. Útil para normalizar objetos de configuração com padrões.Pick<T, K>: Cria um tipo com apenas as chaves especificadas de T. Use-o para criar subtipos focados.Omit<T, K>: Cria um tipo com todas as chaves, exceto as especificadas. Comum para payloads de criação onde o servidor gera o id.Record<K, V>: Cria um tipo de objeto com chaves do tipo K e valores do tipo V. Perfeito para mapas de consulta.Extract<T, U>: Puxa membros de uma união que correspondem a U. Extract<User["role"], "admin" | "editor"> resulta em "admin" | "editor".Exclude<T, U>: Remove membros de uma união que correspondem a U. O inverso de Extract.Extraindo tipos de props de componentes:
// Obtém props de um componente existente
type ButtonProps = React.ComponentProps<typeof Button>;
// Obtém props de um elemento HTML
type DivProps = React.ComponentPropsWithoutRef<"div">;
// Estende props de elementos HTML
type CardProps = React.ComponentPropsWithoutRef<"div"> & {
title: string;
elevated?: boolean;
};Props somente leitura:
type ImmutableUser = Readonly<User>;
// Todos os campos agora são somente leitura - evita mutação acidental
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};Tipos mapeados para estado de formulário:
type FormErrors<T> = Partial<Record<keyof T, string>>;
type UserFormErrors = FormErrors<CreateUserPayload>;
// { name?: string; email?: string; role?: string }NonNullable para remover null/undefined:
type MaybeUser = User | null | undefined;
type DefiniteUser = NonNullable<MaybeUser>; // UserPartial<Pick<User, "name" | "email">> resulta em { name?: string; email?: string }.React.ComponentProps<typeof MyComponent> extrai o tipo de props de qualquer componente, mesmo de terceiros onde o tipo não é exportado.Parameters<T> e ReturnType<T> funcionam em tipos de função. ReturnType<typeof useAuth> fornece o tipo de retorno de um hook personalizado.Omit não gera erro para chaves que não existem no tipo original. Omit<User, "nonExistent"> retorna silenciosamente o tipo User completo.Partial torna tudo opcional, incluindo campos que deveriam permanecer obrigatórios. Use Partial<Pick<T, K>> & Omit<T, K> para tornar apenas alguns campos opcionais.Record<string, T> permite qualquer chave de string. Isso pode ocultar erros de digitação. Prefira chaves de união literal quando o conjunto de chaves for conhecido.Partial ou Readonly. Estes operam apenas nas propriedades de nível superior. Você precisa de tipos recursivos personalizados para transformações profundas.| Abordagem | Prós | Contras |
|---|---|---|
Partial<T> para atualizações | Derivado do tipo original, permanece sincronizado | Torna todos os campos opcionais, não apenas alguns |
| Subtipos manuais | Controle total sobre cada tipo | Duplica definições, desvia do original |
Composição Pick / Omit | Seleção precisa de campos | Composições aninhadas profundamente são difíceis de ler |
Zod .pick() / .omit() | Validação em tempo de execução + inferência de tipo | Requer dependência do Zod |
Operador satisfies | Valida a forma sem alargar | Não cria um tipo reutilizável |
T opcional.Partial<User> para o corpo de uma requisição PATCH.Pick<T, K> cria um tipo com apenas as chaves especificadas de T.Omit<T, K> cria um tipo com todas as chaves, exceto as especificadas.Pick quando quiser um pequeno subconjunto; use Omit quando quiser a maioria dos campos menos alguns.type ButtonProps = React.ComponentProps<typeof Button>;
type DivProps = React.ComponentPropsWithoutRef<"div">;K e valores do tipo V.Record<User["role"], string[]> mapeia cada role para um array de strings de permissão.Extract<T, U> mantém membros da união que correspondem a U.Exclude<T, U> remove membros da união que correspondem a U.Extract<"admin" | "editor" | "viewer", "admin" | "editor"> resulta em "admin" | "editor".Partial<Pick<User, "name" | "email">> resulta em { name?: string; email?: string }.Omit<User, "nonExistent"> retorna silenciosamente o tipo User completo.Partial afeta apenas as propriedades de nível superior.DeepPartial<T>.type UpdateUser = Partial<Pick<User, "name" | "email">> & Omit<User, "name" | "email">;Partial<Pick<>> para os campos opcionais com Omit<> para os restantes.null e undefined de um tipo.NonNullable<User | null | undefined> resulta em User.type AuthData = ReturnType<typeof useAuth>;ReturnType<T> funciona em qualquer tipo de função, incluindo hooks e funções utilitárias.type FormErrors<T> = Partial<Record<keyof T, string>>;Record<keyof T, string> mapeia cada chave de T para um valor string.Partial torna cada mensagem de erro opcional.Revisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥