JavaScript interop, allowJs, checkJs y JSDoc | Nicolás Garzón
JSON
Copiar {
"compilerOptions" : {
"allowJs" : true
}
} Incluye archivos .js dentro del programa. Puede permitir imports entre TS y JS y, según configuración, emitir o generar declarations.
No activa todos los errores de tipos en JavaScript.
JSON
Copiar {
"compilerOptions" : {
"allowJs" : true ,
"checkJs" : true
}
} Activa comprobación en archivos JS.
Desactivar en un archivo legacy:
Usa @ts-nocheck como deuda visible y temporal, no como configuración permanente invisible.
JavaScript
Copiar
function subtotal ( price, quantity ) {
return price * quantity;
} JavaScript
Copiar
const product = {
id : "p1" ,
name : "Keyboard" ,
price : 100 ,
} ; No crea un import runtime.
JavaScript
Copiar
function wrap ( value ) {
return { value } ;
} JavaScript
Copiar
function identity ( value ) {
return value;
} JSDoc soporta una parte importante del sistema, pero la sintaxis avanzada puede ser menos legible que .ts.
JavaScript
Copiar
const routes = {
home : { path : "/" , public : true } ,
} ; Comprueba compatibilidad sin sustituir por completo la inferencia del objeto.
JavaScript
Copiar const input = (
document. querySelector ( "input" )
) ; Es una assertion y puede mentir. Comprueba null y tipo cuando la estructura no está garantizada.
En JavaScript, TypeScript puede ser más permisivo en patrones comunes:
Propiedades añadidas en constructor.
Parámetros opcionales inferidos.
Objetos abiertos.
CommonJS.
JSDoc ayuda a cerrar contratos gradualmente.
JavaScript
Copiar const { readFile } = require ( "node:fs/promises" ) ;
module. exports = { loadConfig } ; TypeScript puede inferir y comprobar muchos patrones. Para librerías, la declaration emitida debe representar correctamente export =, named exports o default interop según el runtime.
JSON
Copiar {
"compilerOptions" : {
"allowJs" : true ,
"declaration" : true ,
"emitDeclarationOnly" : true
}
} Puede generar .d.ts desde JSDoc y exports JavaScript. Revisa la salida: una inferencia interna no siempre es una buena API pública.
Activar allowJs.
Añadir checkJs en carpetas controladas.
Tipar entradas públicas con JSDoc.
Reemplazar any por unknown en fronteras.
Convertir módulos con mayor cambio o valor.
Activar flags strict gradualmente.
Renombrar .js a .ts puede exponer:
Implicit any.
Propiedades dinámicas.
Imports incompatibles.
Globals no declarados.
Nullability.
Formas externas no validadas.
Corrige contratos, no solo sintaxis.
TypeScript
Copiar
legacyCall ( value, true ) ; @ts-expect-error falla si el error desaparece, por lo que es mejor para deuda conocida.
@ts-ignore silencia incluso cuando ya no hay error y puede quedar obsoleto.
Un módulo JavaScript sin tipos puede recibirse como any. Crea un adapter TypeScript que:
Encapsule la importación.
Compruebe resultados.
Exponga un contrato seguro.
TypeScript
Copiar import legacyClient from "legacy-client" ;
export async function loadProduct (
id: string ,
) : Promise < Product> {
const value: unknown = await legacyClient. load ( id) ;
return parseProduct ( value) ;
}
Activar checkJs en todo un monorepo sin estrategia.
Usar ts-nocheck indefinidamente.
Creer que JSDoc valida runtime.
Llenar JS con tipos tan complejos que se vuelve ilegible.
Generar declarations desde inferencia accidental.
Renombrar archivos y usar any para “terminar”.
Usar ts-ignore cuando expect-error documenta mejor.
Permitir que un módulo legacy propague any.
allowJs incluye JavaScript.
checkJs activa diagnósticos.
@ts-check permite migración por archivo.
JSDoc describe parámetros, objetos, generics e imports de tipos.
Assertions JSDoc pueden mentir.
Declaration emit desde JS necesita revisión.
La migración debe avanzar por fronteras y flags.
Encapsula any de librerías legacy en adapters seguros.
¿Por qué @ts-expect-error es mejor que @ts-ignore para una incompatibilidad conocida?
Respuesta Porque produce un error cuando el diagnóstico esperado desaparece, evitando que el comentario quede ocultando código que ya podría corregirse.
Namespaces explica el mecanismo histórico de organización y cuándo los módulos modernos son preferibles.