//
Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Crie e gerencie arquivos de declaração .d.ts para tipos globais, aumento de módulo, pacotes de terceiros sem tipagem e declarações ambientais personalizadas em um projeto React/Next.js.
// types/global.d.ts - Declarações de tipo globais
type User = {
id: string;
name: string;
email: string;
role: "admin" | "editor" | "viewer";
};
type ApiResponse<T> = {
data: T;
meta: {
page: number;
totalPages: number;
};
};// types/environment.d.ts - Variáveis de ambiente tipadas
declare namespace NodeJS {
interface ProcessEnv {
NODE_ENV: "development" | "production" | "test";
DATABASE_URL: string;
NEXT_PUBLIC_API_URL: string;
NEXT_PUBLIC_SITE_URL: string;
AUTH_SECRET: string;
}
}// types/modules.d.ts - Declarando módulos sem tipagem
declare module "some-untyped-library" {
export function doSomething(input: string): Promise<string>;
export function configure(options: { verbose: boolean }): void;
}
// Importações de assets
declare module "*.svg" {
const content: React.FC<React.SVGProps<SVGSVGElement>>;
export default content;
}
declare module "*.png" {
const src: string;
export default src;
}
declare module "*.css" {
const classes: Record<string, string>;
export default classes;
}.d.ts são arquivos de declaração que contêm apenas informações de tipo, sem código de tempo de execução. Eles informam ao TypeScript sobre tipos que existem em tempo de execução, mas que não são expressos em código fonte TypeScript.types/ são incluídos automaticamente se o seu tsconfig.json tiver "include": ["**/*.ts", "**/*.tsx"] ou se o caminho corresponder a um padrão include.declare) dizem ao TypeScript "isso existe em tempo de execução, confie em mim". Use-as para variáveis globais, módulos sem tipagem e extensões de ambiente.declare module "nome-do-modulo". É assim que você adiciona campos a ProcessEnv, estende tipos do Next.js ou corrige tipos de bibliotecas de terceiros.paths, node_modules/@types/*, e então arquivos .d.ts personalizados em diretórios correspondentes a include.Aumentando tipos do Next.js:
// types/next-auth.d.ts - Estendendo os tipos de sessão do next-auth
import { DefaultSession } from "next-auth";
declare module "next-auth" {
interface Session {
user: {
id: string;
role: "admin" | "editor" | "viewer";
} & DefaultSession["user"];
}
}Estendendo o Window:
// types/window.d.ts
declare global {
interface Window {
analytics: {
track: (event: string, properties?: Record<string, unknown>) => void;
identify: (userId: string) => void;
};
__ENV__: Record<string, string>;
}
}
export {}; // Necessário para tornar este um móduloMódulos CSS Tipados:
// types/css-modules.d.ts
declare module "*.module.css" {
const classes: { readonly [key: string]: string };
export default classes;
}
declare module "*.module.scss" {
const classes: { readonly [key: string]: string };
export default classes;
}Criando um tipo utilitário global:
// types/utils.d.ts
type Prettify<T> = {
[K in keyof T]: T[K];
} & {};
type StrictOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type Nullable<T> = T | null;declare global { } modificam o escopo global. O arquivo deve ter pelo menos um import ou export para ser tratado como um módulo; adicione export {} se necessário.declare module "x" aumenta um módulo. Se o módulo já tiver tipos, suas declarações serão mescladas. Se não tiver, sua declaração substituirá o any implícito..d.ts. Eles são apagados durante a compilação e servem apenas como dicas de tipo.typeRoots em tsconfig.json para controlar onde o TypeScript procura por arquivos de declaração: "typeRoots": ["./types", "./node_modules/@types"].export {} em um arquivo com declare global faz com que o arquivo seja tratado como um script (não um módulo), e suas declarações podem não se mesclar corretamente.declare module "x") substituem completamente os tipos do módulo, a menos que você importe do módulo primeiro. Para aumentar, adicione uma instrução de importação.@types/* do DefinitelyTyped podem entrar em conflito com tipos empacotados em versões mais recentes do pacote. Verifique se a biblioteca envia seus próprios tipos antes de instalar @types/.skipLibCheck: true pula a verificação de tipo de todos os arquivos .d.ts, incluindo os seus. Erros em suas declarações personalizadas serão ignorados silenciosamente.ProcessEnv) fornecem confiança em tempo de compilação, mas nenhuma garantia em tempo de execução. A variável ainda pode estar ausente em tempo de execução. Sempre valide na inicialização.| Abordagem | Prós | Contras |
|---|---|---|
Arquivos .d.ts personalizados | Controle total, específico do projeto | Deve ser mantido manualmente |
Pacotes @types/* | Mantido pela comunidade, bem testado | Pode ficar desatualizado em relação às atualizações da biblioteca |
declare inline em arquivos de origem | Co-localizado com o uso | Polui os arquivos de origem |
Zod + z.infer | Validação em tempo de execução + inferência de tipo | Não adequado para tipos ambientais/globais |
Configuração typeRoots | Ordem explícita de resolução de tipos | Fácil de configurar incorretamente |
| Aumento de módulo | Estende tipos existentes de forma limpa | Requer compreensão do sistema de módulos |
export {} (mesmo sem exports reais) força o arquivo a ser tratado como um módulo.// types/environment.d.ts
declare namespace NodeJS {
interface ProcessEnv {
NODE_ENV: "development" | "production" | "test";
DATABASE_URL: string;
NEXT_PUBLIC_API_URL: string;
}
}declare) informam ao TypeScript que algo existe em tempo de execução sem fornecer implementação.declare module "x") estende ou substitui os tipos de um módulo existente.// types/modules.d.ts
declare module "some-untyped-library" {
export function doSomething(input: string): Promise<string>;
export function configure(options: { verbose: boolean }): void;
}.d.ts incluído pelo seu tsconfig.json.import do módulo antes do bloco declare module para mesclar em vez de substituir.declare module "*.svg" {
const content: React.FC<React.SVGProps<SVGSVGElement>>;
export default content;
}
declare module "*.png" {
const src: string;
export default src;
}"typeRoots": ["./types", "./node_modules/@types"].node_modules/@types explicitamente ou perderá o acesso aos pacotes DefinitelyTyped.skipLibCheck pula a verificação de tipo de todos os arquivos .d.ts, incluindo suas declarações personalizadas.types/ serão ignorados silenciosamente.@types/* quando a biblioteca não envia seus próprios tipos e um pacote comunitário existe.@types/* ou quando precisar de substituições específicas do projeto.@types/ -- duplicatas podem causar conflitos.// types/window.d.ts
declare global {
interface Window {
analytics: {
track: (event: string) => void;
};
}
}
export {};declare global para modificar o escopo global.export {}).Revisado por Chris St. John·Última atualização: 10 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥