Ambas descrevem a forma dos dados e são frequentemente intercambiáveis, mas têm capacidades diferentes.
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
Ambas descrevem a forma dos dados e são frequentemente intercambiáveis, mas têm capacidades diferentes.
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
typeinterfacetype ID = string | number; // unions
type Pair = [number, number]; // tuples
type Name = User["name"]; // indexed/mapped/conditional types
type Nullable<T> = T | null; // wrap any type
type é um alias geral para qualquer tipo — primitivos, unions, tuples, mapped types. interface apenas descreve formas de object/function.
interface pode fazer que type não podeinterface Box { width: number; }
interface Box { height: number; } // declaration merging — both merge into one
// Box now has width AND height
Interfaces suportam declaration merging (múltiplas declarações se combinam) e são a forma idiomática de estender/aumentar, incluindo aumentar tipos de bibliotecas de terceiros.
interface Admin extends User { role: string; } // interface
type Admin2 = User & { role: string }; // type uses intersection
Uma convenção comum: use interface para formas de object e APIs públicas (melhores mensagens de erro, extensível, mesclável) e type quando você precisa de unions, tuples ou outras operações de tipo. Escolha um como padrão para consistência — muitas equipes usam interface como padrão para objetos e recorrem a type apenas quando seu poder extra é necessário.