Declaration files .d.ts en TypeScript | Nicolás Garzón
.d.ts
TypeScript
Copiar export function calculateTotal (
items: readonly OrderItem[ ] ,
) : number ;
Texto
Copiar JavaScript real → comportamiento
.d.ts → contrato para TypeScriptSi la declaration promete una API inexistente, el código compila y falla en runtime.
JSON
Copiar {
"compilerOptions" : {
"declaration" : true ,
"declarationMap" : true ,
"emitDeclarationOnly" : true ,
"outDir" : "dist"
}
} declaration genera .d.ts desde exports TypeScript.
TypeScript
Copiar export type Product = {
id: string ;
name: string ;
} ;
export function createProduct (
input: CreateProductInput,
) : Product; Solo declaraciones exportadas y tipos alcanzables forman parte de la salida pública.
TypeScript
Copiar export const version = "1.0" ; TypeScript
Copiar export const version: string ; No se implementa el valor.
TypeScript
Copiar declare const applicationVersion: string ; Indica que el valor existe en runtime por otra fuente.
Dentro de .d.ts, muchas declaraciones son ambient automáticamente y no necesitan repetir declare en cada export.
TypeScript
Copiar export function parseProduct (
value: unknown ,
) : Product; TypeScript
Copiar export class ProductService {
constructor ( repository: ProductRepository) ;
load ( id: string ) : Promise < Product> ;
} Describe constructor, lado static y miembros públicos/protected. Los private fields pueden aparecer para preservar identidad, pero detalles privados no forman parte de la API consumible.
TypeScript
Copiar export interface ProductRepository {
save ( product: Product) : Promise < void > ;
} TypeScript
Copiar declare module "legacy-library" {
export function parse ( value: string ) : unknown ;
} Describe un módulo que el resolvedor encontrará en runtime.
Texto
Copiar package
package/testing
package/adapters/nodesus exports y declarations deben describir esas entradas. Un único index.d.ts no arregla subpaths ausentes.
En paquetes Node modernos:
.d.mts describe un módulo ESM.
.d.cts describe un módulo CommonJS.
.d.ts se interpreta según el package scope y resolución.
El formato debe corresponder con el JavaScript publicado.
JSON
Copiar {
"declarationMap" : true
} Permiten que “Go to Definition” navegue desde .d.ts hacia fuente TypeScript cuando se publican los maps y sources adecuadamente.
TypeScript
Copiar
export function unsafeHelper ( ) { } Con stripInternal, el compilador puede omitir declaraciones marcadas. No valida que la API restante no dependa de ellas; úsalo con cuidado y pruebas del package.
El compilador necesita poder expresar tipos públicos.
TypeScript
Copiar export const value = createComplexInternalValue ( ) ; Con isolatedDeclarations, exports requieren anotaciones suficientes para generar .d.ts por archivo sin análisis completo.
TypeScript
Copiar export function parse ( value: any ) : any ; Propaga pérdida de seguridad a todos los consumidores. Usa generics, unknown o contratos específicos.
Si un export menciona un tipo de otra dependencia, esa dependencia forma parte del contrato de tipos. Debe estar disponible para consumidores, quizá como dependency o peerDependency.
DefinitelyTyped distribuye declarations bajo paquetes @types/* para librerías que no incluyen tipos.
El package debe corresponder con la versión de la librería runtime.
Un package puede compilar internamente y publicar .d.ts rotas. Prueba un proyecto consumidor real:
Imports públicos.
ESM y/o CJS soportados.
Subpaths.
Type inference.
Declaration maps.
TypeScript
Copiar
export { createClient } from "./client.js" ;
export type {
Client,
ClientOptions,
} from "./client.types.js" ; La build genera JS y declarations alineadas.
Escribir implementación dentro de .d.ts.
Declarar valores que no existen.
Publicar .d.ts con formato distinto al JS.
Exponer any en contratos centrales.
Omitir subpath declarations.
Hacer pública una dependencia de tipos no instalable.
Confiar en que la generación automática produce una API buena.
No probar el package como consumidor.
.d.ts describe, no implementa.
Toda declaración debe coincidir con el runtime.
declaration genera contratos desde exports.
El formato ESM/CJS importa también para declarations.
Declaration maps mejoran navegación.
Los tipos públicos necesitan ser nombrables y estables.
Dependencias mencionadas pueden volverse públicas.
Un package debe probar sus declarations desde fuera.
¿Por qué añadir una función únicamente a un .d.ts no añade esa función a la librería?
Respuesta Porque el archivo solo informa al checker; no genera la implementación JavaScript que el runtime debe encontrar.
Ambient declarations y global types describe valores proporcionados por el host sin imports normales.