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:
Biblioteki z natywnym wsparciem dla TypeScript.
Instalowanie zewnętrznych definicji typów.
Tworzenie własnych definicji typów.
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.
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:
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:
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ą.