-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bug: Błędy typów w kodzie pomimo Typescripta #1438
Comments
Problem wynika z użycia funkcji infer bilbioteki zod przy deklaracji typu Notification.
Typ wydedukowany w ten sposób nie zapewnia sprawdzania typów dla swoich pól - z tego powodu można przekazac argument typu string (w kodzie jest to elem.id) do funkcji przyjmujacej argumenty typu number. Jest to jedyne miejsce w kodzie calego projektu, gdy wykorzystywana jest funkcja infer. Po zamianie definicji typu na nastepująca:
sprawdzanie typów działa ponownie dobrze, próba wywołania |
(Śmieszna sprawa – kiedy błąd był zgłaszany, nie używaliśmy jeszcze
Jak to się ma do faktu, że Zaproponowana zmiana w kodzie zawiera zduplikowaną logikę i to oczywiście nie jest idealne. Czy pozostawienie |
Z tego co się zorientowałem spicery i zod są dość podobnymi bibliotekami, dlatego wyjade mi się prawdopodobne, że błąd występuje w obu przypadkach. Natomiast jeśli chodzi o ręczną definicję typów w tym fragmencie kodu
, to jeśli dobrze rozumiem sposób w jaki działa zod, jest to tylko opis jakiego formatu danych oczekujemy, tzn np przy wywołaniu
, i tu typy już nie są zadeklarowane. Wydawałoby się naturalne, gdyby pola obiektu po transformacji również były typu string, ale wygląda na to że są typu any i podjęte przeze mnie próby jawnej definicji typów np:
nie rozwiązały problemu. Wydaje mi się, że typy są więc sprawdzane tylko dynamicznie. Jeśli chodzi o uniknięcie duplikacji kodu, to moim zdaniem zostawienie funkcji infer i wywołanie funkcji deleteOne z parametrem |
Pracując przy komponentach Vue zauważyłem, że jest możliwość popełnienia w nich błędu typów pomimo użycia Typescripta.
Np. w widgecie z powiadomieniami, na ten moment zlokalizowanym tutaj: link. Dało się (a nawet obecnie tak właśnie jest w kodzie produkcyjnym) utworzyć metodę
deleteOne(i: number): Promise<void>
, a następnie wywołać ją z argumentem typu string:deleteOne(elem.id)
, gdzieelem
jest instancją klasyNotification
, aid
jej polem typu string.The text was updated successfully, but these errors were encountered: