Menu

Komentarze w TypeScript: JSDoc, @ts-ignore i @ts-expect-error

TypeScript używa komentarzy JavaScriptu // i /* */ oraz komentarzy JSDoc /** */, które edytory pokazują po najechaniu kursorem. Odczytuje też kilka specjalnych komentarzy: @ts-expect-error, @ts-ignore, @ts-nocheck, @ts-check i dyrektywy /// <reference>.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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:

ZnacznikZnaczenie
@param name descriptionOpisuje parametr
@returns descriptionOpisuje wartość zwracaną
@throws descriptionOpisuje błąd, który funkcja może rzucić
@exampleRozpoczyna blok przykładu, zwykle z blokiem kodu po nim
@deprecated reasonOznacza API jako przestarzałe; edytory rysują je przekreślone
@see lub {@link Name}Wskazuje powiązany kod
@remarksDł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" w tsconfig.json.
  • lib="..." dodaje do programu wbudowaną bibliotekę, jak opcja lib.
  • 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ