Los comentarios de TypeScript son los de JavaScript: // para el resto de una línea y /* */ para un bloque. Un comentario de bloque que empieza por /** es un comentario de documentación (JSDoc), que los editores muestran al pasar el ratón por encima de lo que documenta. Además, TypeScript lee algunos comentarios especiales que cambian cómo el compilador comprueba tu código.
Salida:
212
Los comentarios no afectan al programa. Tampoco afectan a la comprobación de tipos, salvo los comentarios de directiva que se explican más abajo.
Comentarios de una línea y de bloque
// comenta todo lo que viene detrás en la línea, y también es la forma rápida de desactivar una línea de código. /* */ puede ir en medio de una línea o abarcar muchas.
Los comentarios de bloque no se anidan. El primer */ cierra el comentario, así que envolver código que ya contiene un comentario de bloque lo rompe:
/* outer comment /* inner comment */ this text is now code */
El compilador intenta entonces leer this text is now code */ como código e informa un error de sintaxis. Para comentar una zona que contiene comentarios de bloque, usa // en cada línea; la mayoría de los editores lo hace con Ctrl+/ (Cmd+/ en macOS).
Comentarios de documentación JSDoc
Un comentario /** ... */ justo antes de una función, clase, método, propiedad, interfaz o variable la documenta. Los editores muestran su texto en el tooltip al pasar el ratón y en el autocompletado, y los generadores de documentación como TypeDoc lo convierten en páginas de referencia. TSDoc, un estándar para estos comentarios en código TypeScript que empezó Microsoft, usa la misma sintaxis para las etiquetas habituales:
| Etiqueta | Significado |
|---|---|
@param name description | Describe un parámetro |
@returns description | Describe el valor de retorno |
@throws description | Describe un error que la función puede lanzar |
@example | Abre un bloque de ejemplo, normalmente seguido de un bloque de código |
@deprecated reason | Marca una API como obsoleta; los editores la muestran |
@see o {@link Name} | Apunta a código relacionado |
@remarks | Explicación más larga después de la línea de resumen |
En un archivo .ts, no repitas los tipos en JSDoc. Los tipos son las anotaciones del código, y ahí las etiquetas de tipo de JSDoc se ignoran: /** @type {string} */ const v: number = 5; compila sin quejas porque solo cuenta : number.
En un editor, al pasar el ratón por encima de transfer o balance en cualquier parte del proyecto se ven estas descripciones.
Marcar código como obsoleto
@deprecated no provoca un error de compilación. Indica a los editores que muestren cada uso de la función obsoleta tachado y con el motivo al pasar el ratón, que es la forma suave de llevar a quien la llama hacia la alternativa:
Salida:
$19.99
19.99 EUR
@ts-expect-error y @ts-ignore
Estos dos comentarios silencian los errores de tipos de la línea siguiente. A veces es lo correcto: un test que comprueba cómo trata una función una entrada incorrecta en tiempo de ejecución, o un hueco conocido en los tipos de una librería.
Salida:
runtime error: text.toUpperCase is not a function
Sin el comentario, shout(42) es un error de compilación (TS2345). Con él, el archivo compila y la llamada llega a la ejecución, que es justo lo que busca este test.
La diferencia entre las dos directivas aparece cuando el error desaparece. @ts-expect-error exige que haya un error que suprimir, así que un comentario obsoleto se convierte él mismo en un error:
index.ts(6,1): error TS2578: Unused '@ts-expect-error' directive.
// @ts-ignore en el mismo sitio se queda callado, tanto mientras existe el error como cuando ya no está. Por eso @ts-expect-error es la mejor opción por defecto: cuando alguien arregla los tipos, el compilador te avisa de que la supresión sobra. Añade siempre un motivo después de la directiva, como en el ejemplo de arriba, para que quien lea después sepa por qué está ahí.
Las dos cubren solo la línea siguiente y todos sus errores. Para saltarse la comprobación de un valor entero, un as unknown as T explícito o una comprobación en tiempo de ejecución suele ser más claro que un comentario de supresión.
@ts-nocheck y @ts-check
// @ts-nocheck al principio de un archivo desactiva la comprobación de tipos en todo ese archivo. Tiene que ir primero, antes de cualquier código: si está más abajo, se ignora y los errores siguen apareciendo.
// @ts-nocheck
const n: number = "not a number"; // no error reported
Es útil mientras migras una base de código JavaScript grande, y una mala señal en cualquier otro caso.
// @ts-check hace lo contrario en un archivo JavaScript: activa la comprobación de tipos en ese archivo .js, con inferencia y tipos JSDoc, aunque checkJs esté desactivado en tsconfig.json (el archivo tiene que seguir formando parte del proyecto, mediante allowJs):
// @ts-check
/**
* @param {number} cents
* @returns {string}
*/
function formatCents(cents) {
return (cents / 100).toFixed(2);
}
formatCents("12"); // error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
En los archivos JavaScript, las etiquetas JSDoc son los tipos, y así es como muchos proyectos consiguen comprobación de tipos sin convertir los archivos a .ts.
Directivas de triple barra
Un comentario de la forma /// <reference ... /> en la primera línea de un archivo es una directiva para el compilador:
/// <reference types="node" />
/// <reference lib="es2023.array" />
/// <reference path="./globals.d.ts" />
types="node"añade un paquete@typesal programa, como si lo pusieras en"types"detsconfig.json.lib="..."añade una librería integrada al programa, como la opciónlib.path="..."incluye otro archivo; se usa sobre todo dentro de archivos.d.ts.
En código de aplicación, las sentencias import y la configuración de tsconfig.json sustituyen casi todos sus usos; estas directivas aparecen sobre todo en archivos de declaración y en código generado, como el vite-env.d.ts de Vite. Como demostración rápida, lib hace disponible en este archivo un método de array más reciente:
Comentarios en la salida compilada
tsc conserva los comentarios en el JavaScript que genera. Activa "removeComments": true para quitarlos; los comentarios que empiezan por /*! sobreviven incluso así, que es la convención para las cabeceras de licencia:
/*! MyLib v1.2.0 | MIT License */
Los comentarios JSDoc también se copian a los archivos .d.ts cuando declaration está activado, así que quienes usan una librería ven las descripciones en su editor.
Preguntas frecuentes
¿Cómo se escribe un comentario en TypeScript?
Igual que en JavaScript: // inicia un comentario que llega hasta el final de la línea, y /* ... */ delimita un comentario que puede ocupar varias líneas. Un comentario de bloque que empieza por /** es un comentario de documentación (JSDoc), que los editores muestran al pasar el ratón por encima de la función, clase o propiedad documentada.
¿Qué diferencia hay entre @ts-ignore y @ts-expect-error?
Los dos silencian los errores de tipos de la línea siguiente. // @ts-expect-error además comprueba que ahí haya un error: si la línea deja de tenerlo, el compilador informa error TS2578: Unused '@ts-expect-error' directive., así que las supresiones obsoletas no pasan desapercibidas. // @ts-ignore se queda callado para siempre. Es mejor usar @ts-expect-error.
¿Cómo ignoro los errores de TypeScript en un archivo entero?
Pon // @ts-nocheck al principio del archivo, antes de cualquier código. El compilador deja de informar errores de tipos en ese archivo (los errores de sintaxis siguen apareciendo). Es una herramienta de migración; para una sola línea usa // @ts-expect-error.
¿Los comentarios llegan al JavaScript compilado?
Sí, por defecto tsc conserva los comentarios en la salida. Con "removeComments": true los elimina, salvo los que empiezan por /*!, que se mantienen para las cabeceras de licencia. Los bundlers y minificadores suelen quitarlos en las builds de producción.
¿Debo escribir tipos en comentarios JSDoc dentro de un archivo .ts?
No. En los archivos .ts, las etiquetas de tipo de JSDoc como @type {string} o @param {number} x se ignoran al comprobar tipos; los tipos son las anotaciones del código. Usa JSDoc en archivos .ts para las descripciones, y los tipos JSDoc solo en archivos .js comprobados con // @ts-check o checkJs.