Ciekawostki Typescript #3 - z API może przyjść wszystko

2020-10-14

Gdy piszemy w C# kod, który operuje na zdeserializowanym JSON-ie czujemy się pewnie: jeśli coś uda się zdeserializować do zdefiniowanego przez nas typu, to znaczy, że obiket jest poprawny i możemy normalnie na nim pracować. Początkującego programistę TyepScript może jednak zaskoczyć fakt - mimo że w zasadzie oczywisty, jeśli chwilę pomyśleć - iż jeśli “deserializujemy” (cudzysłowy intencjonalnie) coś w JSON-a do obiektu w TS, to możemy dostać “pod spodem” niepoprawne dane. Spójrzmy na przykład.

const json = '{ "firstName": 12 }';
interface Person {
  firstName: string;
}

const person: Person = JSON.parse(json);

console.log(`Hello, ${person.firstName.toUpperCase()}`;

Ten kod będzie poprawny w TS, ale w runtime wywali nam się z błędem: person.firstName.toUpperCase(). “Jak to?”, pomyślicie - “Przecież TypeScript miał sprawdzać typy!“. No, sprawdza, ale to już jest nasza odpowiedzialność, że to, co przychodzi z JSON.parse, chcemy traktować jako typ Person. Oczywiście ten przykład jest naciągany, ale łatwo w to “wdepnąć”, np. gdy korzystamy z biblioteki do wykonywania requestów, np. axios - wówczas ta linijka JSON.parse jest ukryta przed naszymi oczyma, ale ona tam w środku jest. Jeśli więc oczekujemy, że w odpowiedzi na request dostaniemy obiekt typu Person, to API może - wskutek błędu - spłatać figla i wstawić number zamiast stringa. Dowiemy się o tym niestety dopiero w runtime i nie mamy możliwości “deserializacji ze sprawdzeniem typu” - bo przecież informacji o typie już w runtime nie mamy.

Oczywiście wniosek z tego nie jest taki, żeby teraz wszystko sprawdzać: czy string jest stringiem itp. Wyczulam raczej na sytuacje w czasie developmentu, kiedy mogą nam się zdarzać rozjazdy pomiędzy deklaracjami typów, a tym, co zwraca nam np. API - zamiast wyrywać sobie włosy, zastanawiając się, dlaczego zamiast stringa mamy liczbę, sprawdźmy, czy nie jesteśmy ofiarami takiego błędnego założenia, że TS nam będzie typów strzegł także w czasie wykonywania.

Ten wpis jest częścią serii o TypeScripcie, inspirowaną lekturą książki D. Vanderkama pt. “TypeScript. Skuteczne programowanie”.


Robert Skarżycki - zdjęcie profilowe

Pisanina, której autorem jest Robert Skarżycki - programista .NET, mąż szczęśliwej żony, rodzic
moje bio
mój Twitter
mój LinkedIn
moje szkolenia i warsztaty

© 2022, Built with Gatsby & passion