programowanieProgramista Backend / Architekt TypeScript

Jak są realizowane i do czego służą typy opakowań (Wrapper types) w TypeScript? Jakie problemy występują przy pracy z typami prymitywnymi i ich opakowaniami?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

TypeScript rozróżnia typy prymitywne (string, number, boolean) i ich obiektowe opakowania (String, Number, Boolean). Opakowania to obiekty stworzone przy użyciu konstruktorów:

const primitive: string = 'hello'; const wrapper: String = new String('hello');
  • Prymitywy — są proste, efektywne, nie mają metod ani właściwości poza wbudowanymi.
  • Opakowania — to obiekty z odpowiednimi metodami/właściwościami, rzadko stosowane w logice biznesowej.
  • Przy porównywaniu primitive === wrapper — wynik to false:
console.log('hello' === new String('hello')); // false
  • Przy typizacji staraj się zawsze używać prymitywów (string, a nie String).
  • Opakowania stosuje się tylko w przypadku konieczności pracy z bibliotekami API generics (na przykład do refleksji lub metaprogramowania).

Pytanie z pułapką

Czy można używać typów opakowań (String, Number, Boolean) w interfejsach TypeScript, jeśli wartości są prymitywne?

Odpowiedź: Nie zaleca się używania opakowań: w większości przypadków wartości będą prymitywne, a bezpośrednie dziedziczenie interfejsu od typu opakowania prowadzi do błędów. Lepiej zawsze używać string, number, boolean.

Przykłady rzeczywistych błędów spowodowanych niewiedzą o niuansach tematu


Historia

W aplikacji internetowej do przechowywania imion i nazwisk użyto typu String w interfejsie użytkownika. Doprowadziło to do błędów porównawczych i niewłaściwego przechodzenia testów jednostkowych, które wymagały ścisłej identyczności typów (prymitywy i ich opakowania różnią się tożsamością).


Historia

Programista biblioteki typizował funkcję generyczną przez Number, a klienci biblioteki przekazali wartości prymitywne, co spowodowało problemy z metodą type guards, które niespodziewanie nie zadziałały dla prymitywów. Powstał trudny do debugowania błąd rzutowania typów.


Historia

W serwisie analitycznym użyto typu Boolean dla flagi aktywności użytkownika, a wynik porównania przy filtrowaniu danych zawsze wynosił false, chociaż wizualnie wartości się zgadzały. Spowodowało to niewłaściwe przetwarzanie danych i awarie raportów.