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');
primitive === wrapper — wynik to false:console.log('hello' === new String('hello')); // false
string, a nie String).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.
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.