Menu

Commenti in TypeScript: JSDoc, @ts-ignore e @ts-expect-error

TypeScript usa i commenti // e /* */ di JavaScript, più i commenti JSDoc /** */ che gli editor mostrano al passaggio del mouse. Legge anche alcuni commenti speciali: @ts-expect-error, @ts-ignore, @ts-nocheck, @ts-check e le direttive /// <reference>.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

I commenti TypeScript sono commenti JavaScript: // per il resto di una riga e /* */ per un blocco. Un commento a blocco che inizia con /** è un commento di documentazione (JSDoc), che gli editor mostrano quando passi il mouse sull'elemento documentato. In più, TypeScript legge alcuni commenti speciali che cambiano il modo in cui il compilatore controlla il tuo codice.

Output:

212

I commenti non influiscono sul programma. Non influiscono nemmeno sul controllo dei tipi, tranne i commenti direttiva trattati più sotto.

Commenti su una riga e a blocco

// commenta tutto ciò che segue sulla riga, ed è anche il modo rapido per disattivare una riga di codice. /* */ può stare in mezzo a una riga o coprire molte righe.

I commenti a blocco non si annidano. Il primo */ chiude il commento, quindi racchiudere codice che contiene già un commento a blocco lo rompe:

/* outer comment /* inner comment */ this text is now code */

Il compilatore prova allora a leggere this text is now code */ come codice e segnala un errore di sintassi. Per commentare una zona che contiene commenti a blocco, usa // su ogni riga; la maggior parte degli editor lo fa con Ctrl+/ (Cmd+/ su macOS).

Commenti di documentazione JSDoc

Un commento /** ... */ subito prima di una funzione, classe, metodo, proprietà, interfaccia o variabile la documenta. Gli editor mostrano il suo testo nel tooltip al passaggio del mouse e nell'autocompletamento, e i generatori di documentazione come TypeDoc lo trasformano in pagine di riferimento. TSDoc, uno standard per questi commenti nel codice TypeScript avviato da Microsoft, usa la stessa sintassi per i tag più comuni:

TagSignificato
@param name descriptionDescrive un parametro
@returns descriptionDescrive il valore di ritorno
@throws descriptionDescrive un errore che la funzione può lanciare
@exampleApre un blocco di esempio, di solito seguito da un blocco di codice
@deprecated reasonMarca un'API come deprecata; gli editor la mostrano barrata
@see o {@link Name}Rimanda a codice correlato
@remarksSpiegazione più lunga dopo la riga di sintesi

In un file .ts, non ripetere i tipi in JSDoc. I tipi sono le annotazioni nel codice, e lì i tag di tipo JSDoc vengono ignorati: /** @type {string} */ const v: number = 5; compila senza lamentele perché conta solo : number.

In un editor, passando il mouse su transfer o balance in qualsiasi punto del progetto vedi queste descrizioni.

Marcare il codice come deprecato

@deprecated non causa un errore di compilazione. Dice agli editor di mostrare ogni uso della funzione deprecata barrato, con il motivo al passaggio del mouse, ed è il modo gentile per indirizzare chi chiama verso un sostituto:

Output:

$19.99
19.99 EUR

@ts-expect-error e @ts-ignore

Questi due commenti zittiscono gli errori di tipo sulla riga che segue. A volte è la scelta giusta: un test che verifica come una funzione gestisce un input sbagliato a runtime, o una lacuna nota nei tipi di una libreria.

Output:

runtime error: text.toUpperCase is not a function

Senza il commento, shout(42) è un errore di compilazione (TS2345). Con il commento, il file compila e la chiamata arriva al runtime, che è lo scopo di questo test.

La differenza tra le due direttive emerge quando l'errore sparisce. @ts-expect-error pretende che ci sia un errore da sopprimere, quindi un commento obsoleto diventa esso stesso un errore:

index.ts(6,1): error TS2578: Unused '@ts-expect-error' directive.

// @ts-ignore nello stesso punto resta muto, sia mentre l'errore esiste sia dopo che è sparito. Ecco perché @ts-expect-error è la scelta predefinita migliore: quando qualcuno sistema i tipi, il compilatore ti dice che la soppressione può essere tolta. Aggiungi sempre un motivo dopo la direttiva, come nell'esempio sopra, così chi legge dopo sa perché è lì.

Entrambe coprono solo la riga successiva e tutti gli errori su di essa. Per aggirare i controlli su un intero valore, un esplicito as unknown as T o un controllo a runtime è di solito più chiaro di un commento di soppressione.

@ts-nocheck e @ts-check

// @ts-nocheck in cima a un file disattiva il controllo dei tipi per tutto quel file. Deve venire per primo, prima di qualsiasi codice: messo più in basso viene ignorato e gli errori compaiono comunque.

// @ts-nocheck
const n: number = "not a number"; // no error reported

È utile durante la migrazione di un grande codebase JavaScript, e un campanello d'allarme in qualsiasi altro caso.

// @ts-check fa l'opposto in un file JavaScript: attiva il controllo dei tipi per quel file .js, usando l'inferenza e i tipi JSDoc, anche quando checkJs è disattivato in tsconfig.json (il file deve comunque far parte del progetto, tramite 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'.

Nei file JavaScript i tag JSDoc sono i tipi, ed è così che molti progetti ottengono il controllo dei tipi senza convertire i file in .ts.

Direttive triple-slash

Un commento della forma /// <reference ... /> proprio in cima a un file è una direttiva per il compilatore:

/// <reference types="node" />
/// <reference lib="es2023.array" />
/// <reference path="./globals.d.ts" />
  • types="node" aggiunge un pacchetto @types al programma, come elencarlo in "types" in tsconfig.json.
  • lib="..." aggiunge una libreria predefinita al programma, come l'opzione lib.
  • path="..." include un altro file, usato soprattutto dentro i file .d.ts.

Nel codice applicativo, le istruzioni import e le impostazioni di tsconfig.json sostituiscono quasi ogni uso; queste direttive le incontri soprattutto nei file di dichiarazione e nel codice generato come il vite-env.d.ts di Vite. Come rapida dimostrazione, lib rende disponibile in questo file un metodo degli array più recente:

Commenti nell'output compilato

tsc mantiene i commenti nel JavaScript che scrive. Imposta "removeComments": true per eliminarli; i commenti che iniziano con /*! sopravvivono anche in quel caso, ed è la convenzione per le intestazioni di licenza:

/*! MyLib v1.2.0 | MIT License */

I commenti JSDoc vengono copiati anche nei file .d.ts quando declaration è attivo, così chi usa una libreria vede le descrizioni nel proprio editor.

Domande frequenti

Come si scrive un commento in TypeScript?

Come in JavaScript: // inizia un commento che arriva fino alla fine della riga, e /* ... */ racchiude un commento che può occupare più righe. Un commento a blocco che inizia con /** è un commento di documentazione (JSDoc), che gli editor mostrano quando passi il mouse sulla funzione, classe o proprietà documentata.

Che differenza c'è tra @ts-ignore e @ts-expect-error?

Entrambi zittiscono gli errori di tipo sulla riga successiva. // @ts-expect-error controlla anche che lì ci sia un errore: se la riga smette di averne uno, il compilatore segnala error TS2578: Unused '@ts-expect-error' directive., così le soppressioni obsolete vengono notate. // @ts-ignore resta muto per sempre. Preferisci @ts-expect-error.

Come si ignorano gli errori TypeScript in un intero file?

Metti // @ts-nocheck in cima al file, prima di qualsiasi codice. Il compilatore allora non segnala errori di tipo per quel file (gli errori di sintassi compaiono comunque). È uno strumento di migrazione; per una singola riga usa invece // @ts-expect-error.

I commenti finiscono nel JavaScript compilato?

Sì, di default tsc mantiene i commenti nell'output. Con "removeComments": true li elimina, tranne i commenti che iniziano con /*!, che vengono mantenuti per le intestazioni di licenza. Bundler e minificatori di solito li rimuovono nelle build di produzione.

Devo scrivere i tipi nei commenti JSDoc in un file .ts?

No. Nei file .ts, i tag di tipo JSDoc come @type {string} o @param {number} x vengono ignorati dal controllo dei tipi; i tipi sono le annotazioni nel codice. Usa JSDoc nei file .ts per le descrizioni, e i tipi JSDoc solo nei file .js controllati con // @ts-check o checkJs.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA