Skip to content

Interfaces (TypeScript)

As interfaces no TypeScript são contratos que definem a estrutura de um objeto. No nosso projeto, elas são a escolha principal para definir modelos de dados, props de componentes e contratos que precisam ser estendidos.


1. Quando usar Interfaces?

Você deve usar interface sempre que estiver definindo a forma de um objeto que pode ser estendido ou que representa um contrato fixo no sistema.

A. Props de Componentes

Interfaces são excelentes para props porque permitem que outros desenvolvedores estendam o componente facilmente.

tsx
interface ButtonProps {
  label: string;
  onClick: () => void;
}

// Extensão simples
interface IconButtonProps extends ButtonProps {
  icon: string;
}

B. Entidades de Domínio e Modelos

Para definir como um usuário ou um paciente se parece no sistema.

typescript
interface User {
  id: string;
  name: string;
  email: string;
}

C. Declaration Merging

Uma característica única das interfaces é que se você declarar duas interfaces com o mesmo nome, o TS as unifica. Isso é útil para estender bibliotecas externas ou tipos globais.


2. Quando NÃO usar Interfaces?

  1. Para Tipos Primitivos: Você não pode usar interface para dar nome a um tipo simples (ex: string).
  2. Uniões (Unions): Se você precisa que um tipo seja "A ou B", você deve usar type.
  3. Tuplas: Interfaces não lidam bem com estruturas de array fixo.

3. Como fazer vs Como não fazer

✅ Como fazer

  • Use interfaces para definir objetos complexos e props.
  • Aproveite o extends para criar hierarquias de tipos claras.
  • Mantenha os nomes das interfaces em PascalCase (ex: UserSession).
typescript
interface BaseResponse {
  success: boolean;
  message: string;
}

interface UserResponse extends BaseResponse {
  data: User;
}

❌ Como não fazer

  • NÃO use interface como um simples alias de tipo. Se o que você está definindo não é um objeto ou contrato extensível, use type.
  • NÃO use prefixos como IUser. O TypeScript recomenda apenas o nome direto (User).
  • NÃO force uma interface a aceitar múltiplos tipos de retorno via uniões complexas; isso é papel do type.
typescript
// ❌ EVITE: Usar interface para algo que deveria ser um type alias
interface UserId extends string {} // Errado e confuso

// ❌ EVITE: Prefixo 'I'
interface IButtonProps {} // Padrão antigo e desencorajado

Por que isso importa?

Usar interfaces corretamente garante que o compilador do TypeScript consiga otimizar as verificações de tipo e facilita a vida de quem está consumindo seu código, permitindo extensibilidade sem hacks.