JavaScript

Qual e a diferença de Type e Interface no Typescript

Qual e a diferença de Type e: descubra como priorizar ações certas, manter consistência e obter avanço real no curto prazo.

Pedro Mendes
Pedro Mendes
12 de abril de 2026 7 min de leitura
Qual e a diferença de Type e Interface no Typescript

Qual e a diferença de Type e Interface no Typescript

No universo do TypeScript, uma das questões mais frequentes para desenvolvedores, sejam eles novatos ou experientes, é entender profundamente Qual e a diferença de Type e Interface. Ambas as construções servem para definir a forma dos dados, oferecendo tipagem robusta para suas aplicações. No entanto, suas capacidades e casos de uso ideais divergem em aspectos cruciais. Este artigo desmistificará essas diferenças, ajudando você a tomar decisões de design mais assertivas em seus projetos.

Critérios de Comparação: Entendendo a Base

Para compreendermos Qual e a diferença de Type e Interface, é essencial analisar as características que as distinguem. Embora muitas vezes pareçam intercambiáveis, seus superpoderes residem em cenários específicos. Avaliamos a flexibilidade, extensibilidade e capacidade de manipulação de tipos de cada uma.

  • Declaração de Objetos e Estruturas de Dados: Como definem a forma de objetos.
  • Extensibilidade: A capacidade de herdar ou combinar propriedades de outras definições.
  • União e Interseção de Tipos: A aptidão para criar tipos compostos.
  • Mapeamento de Tipos: Transformação de tipos existentes em novos tipos.
  • Declaração de Funções: A maneira como tipam assinaturas de funções.
  • Declaração de Fusão (Declaration Merging): O comportamento quando são declaradas múltiplas vezes com o mesmo nome.
  • Suporte a Tipos Primitivos, Tuplas e Literais: Flexibilidade para tipos não-objeto.

Qual e a diferença de Type e Interface no Typescript: Tabela Comparativa

Para uma visão clara e direta, a tabela a seguir resume as principais distinções entre type e interface.

CaracterísticaInterfaceType Alias (type)
Declaração de ObjetosSim, excelente para definir a forma de objetos e classes.Sim, pode definir a forma de objetos, similar à interface.
Extensibilidade (extends)Pode ser estendida por outras interfaces e classes (implements).Pode estender outros tipos usando interseção (&).
União (|)Não suporta diretamente uniões de tipos.Suporta diretamente uniões de tipos (ex: string | number).
Interseção (&)Pode ser combinada com outros tipos usando interseção (&), mas é mais comum usar extends.Suporta diretamente interseções de tipos (ex: TypeA & TypeB).
Mapeamento de TiposNão suporta diretamente tipos mapeados.Excelente para tipos mapeados, tipos condicionais e outros tipos avançados.
Declaração de FusãoSim, múltiplas declarações com o mesmo nome são fundidas.Não, cada declaração de type deve ser única.
Tipos Primitivos, Tuplas, LiteraisNão pode definir diretamente aliases para tipos primitivos, tuplas ou literais.Pode definir aliases para qualquer tipo, incluindo primitivos, tuplas e literais.
NominaçãoSempre nomeada.Sempre nomeada.

Análise por Cenário: Qual e a diferença de Type e Quando Usar Qual

A escolha entre type e interface muitas vezes se resume ao cenário de uso e às necessidades específicas do seu código. Entender os trade-offs em cada situação é crucial para um código limpo e manutenível.

Cenário 1: Definição de Objetos e Classes

Quando você precisa definir a forma de um objeto ou o contrato que uma classe deve implementar, tanto interface quanto type podem ser usados. Historicamente, interface era a escolha primária para este propósito, e ainda é amplamente preferida por sua semântica clara e capacidade de declaração de fusão.

Exemplo com Interface:

interface Usuario {
    id: number;
    nome: string;
    email?: string;
}

class Admin implements Usuario {
    id: number;
    nome: string;
    nivelAcesso: number;

    constructor(id: number, nome: string, nivelAcesso: number) {
        this.id = id;
        this.nome = nome;
        this.nivelAcesso = nivelAcesso;
    }
}

Exemplo com Type Alias:

type Produto = {
    codigo: string;
    descricao: string;
    preco: number;
};

const meuProduto: Produto = {
    codigo: 'A123',
    descricao: 'Monitor UltraWide',
    preco: 1200.50
};

Recomendação: Para objetos e quando a intenção é ter um “contrato” que pode ser implementado por classes, a interface geralmente é mais idiomática. Se você precisa de algo mais simples, sem o desejo de fusão ou implementação, type também funciona bem.

Cenário 2: Extensão e Composição de Tipos

A forma como interface e type lidam com a extensão e composição é uma de suas maiores diferenças. Interfaces usam a palavra-chave extends, enquanto types utilizam o operador de interseção (&).

A flexibilidade na composição de tipos é um dos pilares da tipagem avançada em TypeScript. Saber como combinar tipos de forma eficaz, seja por extensão ou interseção, pode simplificar grandemente o design de sua arquitetura de dados.

Extensão com Interface:

interface Ponto2D {
    x: number;
    y: number;
}

interface Ponto3D extends Ponto2D {
    z: number;
}

const p3d: Ponto3D = { x: 1, y: 2, z: 3 };

Composição com Type Alias (Interseção):

type Pessoa = {
    nome: string;
    idade: number;
};

type Empregado = Pessoa & {
    cargo: string;
    salario: number;
};

const empregado: Empregado = {
    nome: 'Ana',
    idade: 30,
    cargo: 'Desenvolvedora',
    salario: 5000
};

Ambos os métodos alcançam um resultado similar de combinação de propriedades, mas a sintaxe e a semântica são distintas. A interseção com type é mais versátil, pois pode combinar qualquer tipo, incluindo interfaces e outros types.

Cenário 3: Tipos Complexos, Uniões e Mapeamento

Quando a necessidade é ir além da simples definição de objetos, para lidar com uniões, tuplas, tipos primitivos ou operações de mapeamento de tipos, type é a escolha dominante. Interfaces não conseguem expressar esses conceitos diretamente.

Exemplos com Type Alias:

  1. União de Tipos: type Status = 'pendente' | 'em andamento' | 'concluido';

  2. Tuplas: type Coordenadas = [number, number];

  3. Alias para Primitivos: type ID = string;

  4. Mapeamento de Tipos:

    type SomenteLeitura<T> = {
        readonly : T;
    };
    
    interface Configuracao {
        urlApi: string;
        timeout: number;
    }
    
    type ConfiguracaoImutavel = SomenteLeitura<Configuracao>;

Para aprofundar-se em tipos mais avançados, como tipos condicionais e inferência, a documentação oficial do TypeScript é um recurso valioso. Visite typescriptlang.org/docs para explorar essas funcionalidades.

Cenário 4: Declaração de Fusão (Declaration Merging)

A capacidade de “fusão de declaração” é uma característica exclusiva das interfaces. Isso significa que se você declarar duas interfaces com o mesmo nome, o TypeScript as combinará em uma única interface. Isso é particularmente útil para estender bibliotecas de terceiros ou para modularizar a declaração de tipos em um grande codebase.

Exemplo de Fusão de Interface:

interface Usuario {
    id: number;
    nome: string;
}

interface Usuario {
    email: string; // Esta interface será fundida com a anterior
}

const user: Usuario = {
    id: 1,
    nome: 'João',
    email: 'joao@example.com'
};

Com type, isso não é possível; declarar dois types com o mesmo nome resultaria em um erro de compilação. Essa é uma diferença fundamental para decidir Qual e a diferença de Type e Interface ao criar APIs que podem ser estendidas.

Para mais insights sobre práticas de desenvolvimento e TypeScript, explore outros artigos em nosso blog.

Perguntas frequentes

Posso usar uma interface onde um tipo é esperado e vice-versa?

Sim, em muitos casos, especialmente ao definir a forma de objetos, interfaces e tipos são amplamente intercambiáveis. O TypeScript usa um sistema de tipagem estrutural, o que significa que ele se preocupa mais com a forma de um tipo do que com a maneira como ele foi declarado. No entanto, há exceções importantes, como a impossibilidade de uma interface definir tipos primitivos, uniões ou tuplas, e a ausência de fusão de declarações para tipos.

Qual a prática recomendada: usar interface ou type alias por padrão?

A recomendação geral, conforme a própria equipe do TypeScript, é “use interfaces quando puder, use types quando precisar”. Isso implica que, para a maioria das definições de objetos e contratos, interfaces são uma escolha robusta e legível. Recorra a type quando necessitar das suas capacidades únicas, como uniões, interseções complexas, tuplas, mapeamento de tipos ou aliases para tipos primitivos. Uma boa consistência em seu projeto também é crucial.

Interfaces são mais performáticas que types?

Não há uma diferença de performance significativa entre interfaces e types em tempo de execução, pois ambos são conceitos exclusivos do tempo de compilação do TypeScript e não geram código JavaScript adicional. A escolha entre eles não impacta o desempenho do seu aplicativo em produção, mas sim a flexibilidade e expressividade do seu código em desenvolvimento.

Conclusão

Compreender Qual e a diferença de Type e Interface no TypeScript é fundamental para escrever código robusto e eficiente. Interfaces brilham na definição de contratos de objetos e classes, oferecendo extensibilidade clara e a vantagem da fusão de declarações. Por outro lado, type se destaca por sua versatilidade, permitindo a criação de tipos complexos como uniões, interseções avançadas, tuplas, tipos primitivos e poderosos mapeamentos de tipos.

Ao escolher entre eles, considere a necessidade de fusão de declaração, a complexidade do tipo que está sendo definido e a intenção de uso (um contrato versus uma transformação de tipo). A prática recomendada é usar interfaces para estruturas de objeto e classes sempre que possível, e recorrer a type para cenários mais avançados ou quando precisar de maior flexibilidade na composição de tipos. Ao aplicar esses conhecimentos, você não apenas otimizará seu código, mas também elevará a qualidade e a manutenibilidade de suas aplicações TypeScript. Para explorar mais artigos sobre TypeScript e desenvolvimento, visite nossa categoria de guias práticos.

Pedro Mendes

Sobre Pedro Mendes

Desenvolvedor full stack com foco em aplicações web, automação e entrega confiável de software.

Ver mais artigos