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.