Por que o TypeScript precisa da palavra-chave declare?
\nImagine que você está construindo uma casa, mas alguns cômodos já existem — foram construídos por outra pessoa (por exemplo, uma biblioteca JavaScript). Você não pode entrar lá e reformar as paredes, mas precisa conhecer a planta deles para posicionar os móveis corretamente. Esse é exatamente o papel da palavra-chave declare no TypeScript.
Se você já trabalhou com bibliotecas populares (jQuery, Lodash, D3.js), com certeza já se deparou com arquivos .d.ts — são essas "plantas" criadas com declare. Neste artigo, vamos entender o que é declare, para que serve e como usá-lo na prática. Prepare-se: vai ter bastante código e pouca enrolação.
O que é declare no TypeScript?
\ndeclare é uma palavra-chave que informa ao compilador TypeScript: "Ei, essa coisa (variável, função, classe ou módulo) existe, mas está definida em outro lugar. Apenas confie em mim e deixe eu usá-la no código."
É importante entender: declare não gera nenhum código JavaScript. É uma construção puramente informativa para o compilador. Se você escrever declare const x: number = 5, após a compilação o x desaparecerá — ele não estará no arquivo final.
Quando usar?
\n- \n
- Trabalhando com variáveis globais — como
window,documentou variáveis adicionadas via CDN. \n - Tipagem de bibliotecas JavaScript — quando a biblioteca é escrita em JS puro, mas você quer usá-la com TypeScript. \n
- Criação de tipos para arquivos de configuração — módulos CSS, imagens, arquivos JSON. \n
Sintaxe do declare: exemplos básicos
\n\n1. Declaração de variáveis
\nSuponha que você tenha uma variável global VERSION, definida no arquivo HTML via <script>. O TypeScript não sabe nada sobre ela, então você escreve:
declare const VERSION: string;\n\nconsole.log(VERSION); // OK, TypeScript sabe que é uma string\n\nApós a compilação, declare const VERSION: string desaparece, mas console.log(VERSION) permanece.
2. Declaração de funções
\nImagine que você tem uma função global trackEvent de analytics:
declare function trackEvent(eventName: string, properties?: Record<string, any>): void;\n\n// Uso\ntrackEvent("button_click", { buttonId: "submit" });\n\nO compilador não vai verificar a implementação — ele apenas conhece a assinatura.
\n\n3. Declaração de classes
\nUma biblioteca fornece a classe Moment no espaço de nomes global:
declare class Moment {\n constructor(date: string);\n format(pattern: string): string;\n}\n\n// Uso\nconst now = new Moment("2024-01-01");\nconsole.log(now.format("YYYY-MM-DD"));\n\n\n4. Declaração de módulos
\nEste é o cenário mais comum. Por exemplo, módulos CSS ou arquivos JSON:
\n// styles.d.ts\ndeclare module "*.css" {\n const styles: Record<string, string>;\n export default styles;\n}\n\n// images.d.ts\ndeclare module "*.png" {\n const src: string;\n export default src;\n}\n\nAgora você pode importar CSS e imagens sem erros no TypeScript.
\n\ndeclare e arquivos .d.ts
\nArquivos com extensão .d.ts (declarações de tipos) são o "habitat natural" da palavra-chave declare. Eles contêm apenas declarações e não são compilados para JavaScript. Geralmente ficam na pasta types/ ou são fornecidos junto com a biblioteca (ex.: @types/lodash).
Exemplo: criando tipos para jQuery
\n