Paweł Łukasiewicz
2024-12-02
Paweł Łukasiewicz
2024-12-02
Udostępnij Udostępnij Kontakt
Wprowadzenie

TypeScript doskonale współpracuje z bibliotekami JavaScript, oferując silne typowanie i autouzupełnianie dla popularnych narzędzi. Jednak wiele zewnętrznych bibliotek JavaScript (szczególnie starszych) nie jest domyślnie napisanych w TypeScript, co może powodować problemy z brakiem typów. W tym wpisie omówimy, jak radzić sobie z tym problemem, jak dodawać typy dla bibliotek oraz jakie narzędzia i podejścia są do tego używane.

W tym rozszerzonym wpisie omówimy:

  1. Biblioteki z natywnym wsparciem dla TypeScript.
  2. Instalowanie zewnętrznych definicji typów.
  3. Tworzenie własnych definicji typów.
  4. Typowanie dynamicznych bibliotek.

Biblioteki z natywnym wsparciem dla TypeScript

Wiele nowoczesnych bibliotek JavaScript (zwłaszcza popularnych w społeczności) oferuje natywne wsparcie dla TypeScript, co oznacza, że dostarczają one własne definicje typów razem z kodem. Kiedy instalujesz taką bibliotekę, nie musisz martwić się o dodawanie dodatkowych typów – są one dostarczone razem z biblioteką.

Przykład z biblioteką Axios (HTTP Client):

Instalacja Axiosa

npm install axios
Axios jest już dostarczany z pełnym wsparciem dla TypeScript. Kiedy korzystasz z tej biblioteki, TypeScript automatycznie rozpozna typy:
import axios from 'axios';

axios.get('https://api.example.com/users')
  .then(response => {
    console.log(response.data);
  });
Dzięki wbudowanemu wsparciu dla typów, nie musisz instalować żadnych dodatkowych paczek.

2. Instalowanie zewnętrznych definicji typów

Nie wszystkie biblioteki mają wbudowane typy. W takim przypadku, najczęściej spotykanym rozwiązaniem jest instalacja zewnętrznych definicji typów z repozytorium DefinitelyTyped, które jest ogromną bazą typów dla popularnych bibliotek JavaScript.

Definicje te instalujesz za pomocą paczek npm, które mają prefiks @types. Typy te są niezależnie aktualizowane i obsługiwane przez społeczność TypeScript.

Przykład z biblioteką lodash (biblioteka narzędziowa):

Lodash jest biblioteką JavaScript bez wbudowanych typów, ale ma dostępne definicje w DefinitelyTyped.

Instalacja Lodash i jego typów:

npm install lodash
npm install --save-dev @types/lodash
Po zainstalowaniu pakietu @types/lodash, możesz korzystać z Lodash w swoim projekcie z pełnym wsparciem dla typów:
import _ from 'lodash';

const numbers = [1, 2, 3];
const doubled = _.map(numbers, n => n * 2);

console.log(doubled);  // [2, 4, 6]
Typy zostaną automatycznie rozpoznane, a TypeScript będzie walidować, czy prawidłowo korzystasz z funkcji Lodash.

3. Tworzenie własnych definicji typów

Czasami może się zdarzyć, że biblioteka nie ma dostępnych typów w DefinitelyTyped, lub sam tworzysz bibliotekę, dla której chcesz zdefiniować typy. W takim przypadku możesz ręcznie stworzyć plik z definicjami typów.

Przykład tworzenia własnych definicji typów:

Załóżmy, że korzystasz z biblioteki myLibrary, która nie ma dostępnych typów. Możesz stworzyć plik o nazwie myLibrary.d.ts, który będzie zawierał typy dla tej biblioteki:

// myLibrary.d.ts
declare module 'myLibrary' {
  export function greet(name: string): string;
  export const version: string;
}
Następnie, w swoim kodzie możesz używać tej biblioteki z pełnym wsparciem dla typów:
import { greet, version } from 'myLibrary';

console.log(greet('John'));  // "Hello, John"
console.log(version);        // np. "1.0.0"
TypeScript użyje tej definicji, aby sprawdzić poprawność typów w trakcie pisania kodu.

4. Typowanie dynamicznych bibliotek

Niektóre biblioteki, zwłaszcza te dynamiczne, mogą być trudne do typowania, ponieważ ich funkcje i struktura zmieniają się w trakcie działania programu. Przykłady takich bibliotek to np. jQuery lub dynamiczne wczytywanie modułów.

W takich przypadkach warto korzystać z typów bardziej elastycznych, takich jak any lub unknown, które pozwolą na większą swobodę w typowaniu:

Przykład z jQuery:

npm install jquery
npm install --save-dev @types/jquery
Po zainstalowaniu typów możemy używać jQuery z podstawowym typowaniem:
import $ from 'jquery';

$('#element').click(() => {
  console.log('Element clicked');
});
Jeżeli funkcje w bibliotece nie mają jednoznacznych typów, możemy także zdefiniować bardziej ogólne typy, takie jak:
let dynamicValue: any = $('#element').data('value');
Typ any pozwala nam na tymczasowe ignorowanie typów, ale warto być ostrożnym, ponieważ eliminuje to zalety TypeScript w zakresie bezpieczeństwa typów.

Podsumowanie

Dodawanie typów do zewnętrznych bibliotek w TypeScript może być łatwe, jeśli biblioteka ma wbudowane wsparcie dla typów lub dostępne definicje w DefinitelyTyped. W przypadku, gdy typów brakuje, zawsze możesz stworzyć własne definicje. Pamiętaj również, że narzędzia takie jak @types ułatwiają integrację i typowanie zewnętrznych bibliotek, co czyni pracę z TypeScript jeszcze bardziej wydajną i bezpieczną.