Komentarze w TypeScript to komentarze JavaScriptu: // do końca linii i /* */ dla bloku. Komentarz blokowy zaczynający się od /** to komentarz dokumentacyjny (JSDoc), który edytory wyświetlają po najechaniu na element, który opisuje. Do tego TypeScript odczytuje kilka specjalnych komentarzy, które zmieniają sposób, w jaki kompilator sprawdza kod.
Wynik:
212
Komentarze nie wpływają na program. Nie wpływają też na sprawdzanie typów, z wyjątkiem komentarzy z dyrektywami opisanych niżej.
Komentarze jednoliniowe i blokowe
// zakomentowuje wszystko, co jest po nim w linii, i to też szybki sposób na wyłączenie linii kodu. /* */ może stać w środku linii albo obejmować wiele linii.
Komentarze blokowe się nie zagnieżdżają. Pierwsze */ kończy komentarz, więc opakowanie kodu, który już zawiera komentarz blokowy, psuje go:
/* outer comment /* inner comment */ this text is now code */
Kompilator próbuje wtedy odczytać this text is now code */ jako kod i zgłasza błąd składni. Żeby zakomentować fragment, który zawiera komentarze blokowe, użyj // w każdej linii; większość edytorów robi to skrótem Ctrl+/ (Cmd+/ na macOS).
Komentarze dokumentacyjne JSDoc
Komentarz /** ... */ bezpośrednio przed funkcją, klasą, metodą, właściwością, interfejsem albo zmienną dokumentuje ją. Edytory pokazują jego tekst w dymku po najechaniu kursorem i w podpowiedziach, a generatory dokumentacji, takie jak TypeDoc, zamieniają go w strony referencyjne. TSDoc, standard takich komentarzy w kodzie TypeScript zapoczątkowany przez Microsoft, używa tej samej składni dla popularnych znaczników:
| Znacznik | Znaczenie |
|---|---|
@param name description | Opisuje parametr |
@returns description | Opisuje wartość zwracaną |
@throws description | Opisuje błąd, który funkcja może rzucić |
@example | Rozpoczyna blok przykładu, zwykle z blokiem kodu po nim |
@deprecated reason | Oznacza API jako przestarzałe; edytory rysują je |
@see lub {@link Name} | Wskazuje powiązany kod |
@remarks | Dłuższe wyjaśnienie po linii podsumowania |
W pliku .ts nie powtarzaj typów w JSDoc. Typami są adnotacje w kodzie, a znaczniki typów JSDoc są tam ignorowane: /** @type {string} */ const v: number = 5; kompiluje się bez zastrzeżeń, bo liczy się tylko : number.
W edytorze najechanie na transfer albo balance w dowolnym miejscu projektu pokazuje te opisy.
Oznaczanie kodu jako przestarzałego
@deprecated nie powoduje błędu kompilacji. Każe edytorom pokazywać każde użycie przestarzałej funkcji jako przekreślone, z powodem w dymku, co jest łagodnym sposobem na skierowanie wywołujących do zamiennika:
Wynik:
$19.99
19.99 EUR
@ts-expect-error i @ts-ignore
Te dwa komentarze wyciszają błędy typów w linii, która po nich następuje. Czasem to słuszna decyzja: test, który sprawdza, jak funkcja radzi sobie w czasie działania ze złymi danymi, albo znana luka w typach biblioteki.
Wynik:
runtime error: text.toUpperCase is not a function
Bez komentarza shout(42) to błąd kompilacji (TS2345). Z komentarzem plik się kompiluje, a wywołanie dociera do czasu działania, i o to chodzi w tym teście.
Różnica między tymi dwiema dyrektywami ujawnia się, gdy błąd zniknie. @ts-expect-error wymaga, żeby był błąd do wyciszenia, więc nieaktualny komentarz sam staje się błędem:
index.ts(6,1): error TS2578: Unused '@ts-expect-error' directive.
// @ts-ignore w tym samym miejscu milczy, zarówno gdy błąd istnieje, jak i po jego zniknięciu. Dlatego @ts-expect-error to lepszy wybór domyślny: gdy ktoś naprawi typy, kompilator powie ci, że wyciszenie można usunąć. Zawsze dopisz powód po dyrektywie, jak w przykładzie wyżej, żeby następna osoba czytająca kod wiedziała, dlaczego tam jest.
Obie dyrektywy obejmują tylko następną linię i wszystkie błędy w niej. Przy obchodzeniu typu całej wartości jawne as unknown as T albo sprawdzenie w czasie działania jest zwykle czytelniejsze niż komentarz wyciszający.
@ts-nocheck i @ts-check
// @ts-nocheck na początku pliku wyłącza sprawdzanie typów dla całego pliku. Musi być pierwsze, przed jakimkolwiek kodem: umieszczone niżej jest ignorowane, a błędy nadal się pojawiają.
// @ts-nocheck
const n: number = "not a number"; // no error reported
Przydaje się przy migracji dużego projektu JavaScript, a wszędzie indziej to sygnał ostrzegawczy.
// @ts-check robi odwrotnie w pliku JavaScript: włącza sprawdzanie typów dla tego pliku .js, korzystając z wnioskowania i typów JSDoc, nawet gdy checkJs jest wyłączone w tsconfig.json (plik nadal musi należeć do projektu, przez 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'.
W plikach JavaScript znaczniki JSDoc są typami i w ten sposób wiele projektów ma sprawdzanie typów bez przerabiania plików na .ts.
Dyrektywy z potrójnym ukośnikiem
Komentarz w postaci /// <reference ... /> na samym początku pliku to dyrektywa kompilatora:
/// <reference types="node" />
/// <reference lib="es2023.array" />
/// <reference path="./globals.d.ts" />
types="node"dodaje do programu pakiet@types, jak wpisanie go w"types"wtsconfig.json.lib="..."dodaje do programu wbudowaną bibliotekę, jak opcjalib.path="..."dołącza inny plik, używane głównie w plikach.d.ts.
W kodzie aplikacji instrukcje import i ustawienia tsconfig.json zastępują prawie każde użycie; te dyrektywy spotkasz głównie w plikach deklaracji i w kodzie generowanym, takim jak vite-env.d.ts z Vite. Na szybki pokaz: lib udostępnia w tym pliku nowszą metodę tablic:
Komentarze w skompilowanym wyniku
tsc zachowuje komentarze w JavaScripcie, który zapisuje. Ustaw "removeComments": true, żeby je usunąć; komentarze zaczynające się od /*! zostają nawet wtedy, co jest konwencją dla nagłówków licencji:
/*! MyLib v1.2.0 | MIT License */
Komentarze JSDoc są też kopiowane do plików .d.ts, gdy włączone jest declaration, więc użytkownicy biblioteki widzą opisy w swoim edytorze.
Najczęściej zadawane pytania
Jak napisać komentarz w TypeScript?
Tak samo jak w JavaScript: // zaczyna komentarz, który trwa do końca linii, a /* ... */ obejmuje komentarz, który może zajmować kilka linii. Komentarz blokowy zaczynający się od /** to komentarz dokumentacyjny (JSDoc), który edytory pokazują po najechaniu na udokumentowaną funkcję, klasę lub właściwość.
Czym różni się @ts-ignore od @ts-expect-error?
Oba wyciszają błędy typów w następnej linii. // @ts-expect-error dodatkowo sprawdza, czy błąd tam jest: jeśli linia przestanie go mieć, kompilator zgłasza error TS2578: Unused '@ts-expect-error' directive., więc nieaktualne wyciszenia zostają zauważone. // @ts-ignore milczy zawsze. Wybieraj @ts-expect-error.
Jak zignorować błędy TypeScript w całym pliku?
Umieść // @ts-nocheck na początku pliku, przed jakimkolwiek kodem. Kompilator nie zgłasza wtedy dla tego pliku żadnych błędów typów (błędy składni nadal się pojawiają). To narzędzie do migracji; dla pojedynczej linii użyj zamiast tego // @ts-expect-error.
Czy komentarze trafiają do skompilowanego JavaScriptu?
Tak, domyślnie tsc zachowuje komentarze w wyniku. Z "removeComments": true je usuwa, z wyjątkiem komentarzy zaczynających się od /*!, które zostają dla nagłówków licencji. Bundlery i minifikatory zwykle usuwają je w buildach produkcyjnych.
Czy w pliku .ts pisać typy w komentarzach JSDoc?
Nie. W plikach .ts znaczniki typów JSDoc, takie jak @type {string} czy @param {number} x, są ignorowane przy sprawdzaniu typów; typami są adnotacje w kodzie. W plikach .ts używaj JSDoc do opisów, a typów JSDoc tylko w plikach .js sprawdzanych przez // @ts-check albo checkJs.