import/export Módulos e exportações (interoperabilidade CommonJS)

Última atualização: 2026-10-23

import/export Módulos e exportações (interoperabilidade CommonJS)

ES Modules é o padrão oficial de módulos do JavaScript. O TypeScript reutiliza a sintaxe export/import e traz os tipos para dentro do sistema de módulos: tipos podem ser exportados e importados, e import type importa apenas tipos — totalmente apagado após a compilação. Um arquivo barrel (geralmente index.ts) reexporta vários módulos para que os consumidores precisem de um único ponto de entrada. A interoperabilidade com CommonJS é regida por opções do compilador como module e esModuleInterop.

GrupoConfiguração e Prática
TipoSintaxe
Modo strictNão necessário

ℹ️ Info O editor transpila TypeScript para JavaScript e o executa (sem verificação de tipos); veja a Saída de cada exemplo para o resultado da verificação.

📝 Sintaxe

// Exportando
export interface User { id: number; name: string }  // exporta um tipo
export const add = (a: number, b: number) => a + b; // exporta um valor
export default function greet() {}                  // exportação padrão

// Importando
import greet, { add } from "./math";  // padrão + nomeada
import type { User } from "./types";  // apenas tipos, apagado após compilar
export * from "./math";               // reexportação em barrel

⚙️ Parâmetros

export defaultA exportação padrão do módulo, no máximo uma por módulo; importe com qualquer nome e sem chaves
export * from / re-exportO núcleo dos arquivos barrel: encaminha todas as exportações nomeadas de um submódulo; exportações apenas de tipo também são encaminhadas
import type / inline typeimport type { User } e o modificador embutido import { type User } declaram uma importação apenas de tipo — nenhum código em tempo de execução é emitido

Retorno:Módulos não retornam nada; os valores e tipos exportados formam em conjunto a interface pública do módulo para outros módulos importarem.

▶ Exemplo

Edite o código abaixo e clique em Testar para ver o resultado transpilado:

Saída:

Hello, Ada!
add === add2: true

(Saída de execução após a transpilação; este editor roda como um script inline no navegador e não consegue importar de outros arquivos de verdade, então o código acima marca os limites dos módulos em comentários e mostra uma forma equivalente executável — em um projeto real continuam sendo quatro arquivos separados, types.ts / math.ts / utils.ts / main.ts, User é um tipo puro e import type não deixa rastro após a compilação)

💡 Observações

ℹ️ Info import type e importar um tipo por meio de um import normal se comportam da mesma forma, mas import type é explícito e seguro sob isolatedModules; a parte de tipo de ambos desaparece após a compilação.
💡 Dica Coloque o barrel na raiz de src (index.ts) contendo apenas linhas export * from / export { x } from; os consumidores então importam de @/utils em vez de caminhos profundos como @/utils/math, e reestruturar a árvore de diretórios só toca o barrel.
⚠️ Atenção A interoperabilidade com CommonJS é uma armadilha comum: como import default mapeia para module.exports no CJS compilado é propenso a erros; esModuleInterop (com module: commonjs) torna o comportamento conforme à especificação, e module: node16/nodenext exige ainda extensões completas nas importações relativas.
Mais casos em breve.

📚 Tutoriais relacionados

❓ Perguntas frequentes

P Qual é a diferença entre import type e um import normal?
R Um import normal pode compilar para uma chamada require mesmo que você só use seus tipos; import type garante uma importação apenas de tipo com zero código em tempo de execução. Sob isolatedModules ou com tree-shaking do bundler, ele evita manter um pacote inteiro só pelos tipos.
P Quando vale a pena criar um arquivo barrel?
R Quando um diretório expõe mais do que alguns poucos módulos que os consumidores importam em conjunto. Note que barrels puxam todos os submódulos para um único grafo de dependências e podem prejudicar o tree-shaking; servem bem a bibliotecas utilitárias puras, mas avalie com cuidado em conjuntos grandes de componentes nos quais o tamanho do bundle importa.
P Por que recebo "Cannot use import statement outside a module" em tempo de execução?
R O ambiente de execução não entende sintaxe ESM: as importações não foram transformadas (target novo demais ou opção module errada), ou o Node trata .js como CJS. Corrija definindo module como commonjs (ou deixando um bundler cuidar do ESM), usando .mjs ou declarando "type": "module" no package.json.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%