[Typescript] 🤔 Type ou Interface na hora de tipar?
Fala pessoal,
Venho migrando alguns projetos do commonjs para o typescript e me surgiu uma dúvida sobre a utilização correta ou ao menos a "boa prática" de se usar type e/ou interface na tipagem.
Minha "metodologia"
Exemplo:
type BrasilAPITypes = {
cnpj: string;
razao_social: string;
ddd_telefone_1: string;
};
interface MeusDadosdeSaidaInterface {
doc: string;
razao: string;
telefone: string
}
class TesteBrasilAPI {
consultaEmpresa(dados: BrasilAPITypes): MeusDadosdeSaidaInterface {
return {
doc: dados.cnpj,
razao: dados.razao_social,
telefone: dados.ddd_telefone_1
}
}
}
Para fins "didáticos" suponhamos que o parametro dados
do método consultaEmpresa
é populado/alimentado pelo response de algum método qualquer que faça a requisiçao a API e na sequência explico como uso cada caso.
Type
Imagino que uma API externa tem parâmetros imutáveis e nunca antes "tipados" dentro do meu sistema e por isso ao tratar dados recebidos de APIs eu prefiro a utilização do TYPE para que ao consumir o response dela em qualquer parte do meu projeto eu já tenho facilitado o acesso aos parâmetros e tipos que ela possuir.
Interface
Todos os métodos e funções do meu sistema o retorno eu "tipo" com Interface porque além de me pertimitir a implementação direta numa classe, também me permite adicionar novos parâmetros dentro dela caso seja necessário em algum ponto do meu projeto redeclarando ela e passando esses novos parâmetros
O que vocês acham sobre isso? Type ou Interface na tipagem?
Fala @guilzms, tudo tranquilo?
Minha visão sobre Type e Interface
A respeito de qual "modelagem" utilizar em relação ao projeto, no curso que estou fazendo de typescript tive a seguinte visão sobre o uso do alias type e interface:
TYPE: Geralmente utilizado para criar um atalho (alias) para um tipo customizado. Utilizado em tipos primitivos (string, boolean, number...):
type Categorias = 'design' | 'codigo' | 'descod';
function pintarCategoria(categoria: Categorias) {
if (categoria === 'design') {
console.log('Pintar vermelho');
} else if (categoria === 'codigo') {
console.log('Pintar verde');
} else if (categoria === 'descod') {
console.log('Pintar roxo');
}
}
INTERFACE: Geralmente são utilizadas para definirmos objetos, entretanto não possibilita renomear tipos primitivos.
interface InterfaceProduto {
nome: string;
preco: number;
teclado: number;
}
function preencherDados(dados: InterfaceProduto) {
document.body.innerHTML += `
<div>
<h2>${dados.nome}</h2>
<p>R$ ${dados.preco}</p>
<p>Inclui teclado: ${dados.teclado ? 'sim' : 'não'}</p>
</div>
`;
}
Um bom ponto de observação, é que quando você cria um alias type,você está criando um apelido e nada mais. O Type
é do tipo fechado, onde não é possÃvel criar diferentes "versões" do mesmo tipo, então sua repetição gerará um Erro de TS:
// TYPE
type Window = {
title: string
}
type Window = {
ts: TypeScriptAPI
}
// Error: Duplicate identifier 'Window'.
Para realizar a adição de uma nova propriedade a um Type
, seria necessário fazer o seguinte processo:
type TipoCarro = {
rodas: number;
portas: number;
};
type TipoCarroComPreco = TipoCarro & {
preco: number;
};
const dado1: TipoCarroComPreco = {
preco: 20000,
rodas: 4,
portas: 5,
};
Já a Interface
é do tipo aberta, então a mesma possibilita adicionar ou alterar campos, e também extende-la apenas redeclarando a mesma :
// Redeclaração de campos
interface InterfaceCarro {
rodas: number;
portas: number;
}
interface InterfaceCarro {
preco: number;
}
const dado2: InterfaceCarro = {
preco: 20000,
rodas: 4,
portas: 5,
};
Conclusão
O Matheus Benites - PapoDe.Dev dá um excelente panorama sobre a utilização de types e Interface:
se precisamos declarar os tipos de uma classe e seus metodos utilizamos interface; se precisamos declarar os tipo das props de uma função usamos alias type; se precisar criar uma definição de tipo que será extendida por algo, nós usamos interface; se estamos criando um generic type para alguma funcionalidade, usamos interface.
Espero ter ajudado, até mais!
Fontes:
Matheus Benites - PapoDe.Dev Documentação - Curso de Typescript - Origamid
Não sei se existe uma forma "certa" para esse tipo de coisa.
Eu normalmente uso interface da mesma forma que outras linguagens como Java ou PHP, ou seja, mais próximo do escopo de classes mesmo.
Já o type, uso para definir as estrutura dos dados que não tem comportamentos, como DTOs ou parâmetros de funções.
Não conheço muito bem typescript, mas acredito que este video possa te ajudar:
https://www.youtube.com/watch?v=s9qgTlpYDuA
basicamente, ele mostra 3 principais diferenças entre as formas de tipagem:
Merge declaration 'in'/'keyof' Types com tipos primitivos.
Espero que te ajuda a escolher a melhor forma.
Não sei se ainda é valido, pois ja faz algum tempo que foi gravado.
Costumo usar interface
pra tudo, até que um meteoro ameaçe cair na terra caso eu use type
. Vide a documentação do TypeScript: