-
Notifications
You must be signed in to change notification settings - Fork 9
[2025-11-17] Czy wiesz, że TypeScript ma typ bezpieczniejszy niż Any? #274
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
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| --- | ||
| layout: post | ||
| title: Czy wiesz, że TypeScript ma typ bezpieczniejszy niż Any? | ||
| description: "" | ||
| date: 2025-11-17T08:00:00+01:00 | ||
| published: true | ||
| didyouknow: false | ||
| lang: pl | ||
| author: wstolarski | ||
| image: /assets/img/posts/2025-11-17-czy-wiesz-ze-typescript-ma-typ-bezpieczniejszy-niz-any/thumbnail.webp | ||
| tags: | ||
| - typescript | ||
| --- | ||
|
|
||
| W TypeScript, poza `string` czy `number`, mamy też kilka specjalnych typów do obsługi sytuacji, gdy nie znamy typu danych. Przyjrzyjmy się im z bliska. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. przejrzałem całe, nie mam uwag :) (poza tym, żeby wszystko ujednolicić i przepisać w liczbie mnogiej, z tym się zgadzam) |
||
|
|
||
| ## Any i unknown – podobieństwa i różnice | ||
|
|
||
| Na pierwszy rzut oka typy `any` i `unknown` wyglądają podobnie. Oba pozwalają przypisać do siebie dowolną wartość. To, co możesz potem z tym zrobić, nieco się różni. | ||
|
|
||
| ### Typ any – "nie wiem i nie interesuje mnie to" | ||
| Typ `any` wyłącza sprawdzanie typów dla danej zmiennej w TypeScript. Kompilator nie sprawdza, co przypisujesz i jak używasz tej zmiennej. Możesz zrobić z nią wszystko, a ewentualny błąd zobaczysz dopiero w trakcie działania aplikacji. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wydaje mi się, że powinniśmy stosować formę wieloosobową lub bezosobową. Jest niespójność. Raz tekst jest w pierwszej osobie raz w liczbie mnogiej
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ogarne |
||
|
|
||
| ```typescript | ||
| let drawer: any = "Old watch"; | ||
| console.log(drawer.substring(6)); // Działa | ||
|
|
||
| drawer = { keys: 3 }; | ||
| // Kompilator nie zgłasza błędu, ale runtime już tak: | ||
| console.log(drawer.substring(6)); // TypeError: drawer.substring is not a function | ||
| ``` | ||
|
|
||
| ### Typ unknown – "nie wiem, ale sprawdzę" | ||
| Typ `unknown` jest bezpieczniejszą alternatywą dla `any`. Możesz przypisać dowolną wartość, ale TypeScript wymaga, by przed użyciem sprawdzić typ tej zmiennej. Dzięki temu nie popełnisz błędu w runtime. | ||
|
|
||
| ```typescript | ||
| let box: unknown; | ||
| box = "keyboard"; | ||
| console.log(box.toUpperCase()); | ||
| // TypeScript zgłasza błąd kompilacji: 'box' is of type 'unknown'. | ||
|
|
||
| // Rozwiązaniem problemu jest sprawdzenie typu: | ||
| if (typeof box === "string") { | ||
| console.log(box.toUpperCase()); | ||
| } | ||
| ``` | ||
|
|
||
| ## Typ never – "to się nigdy nie wydarzy" | ||
| Typ `never` oznacza, że funkcja nigdy nie zakończy swojego działania normalnie (np. zawsze rzuca wyjątek lub wpada w nieskończoną pętlę). | ||
| Nie należy mylić tego z `void` (funkcja się kończy, ale nic nie zwraca). `never` sygnalizuje, że kod jest nieosiągalny. | ||
|
|
||
| ### Przypadki użycia | ||
| Spójrzmy na kilka przykładów użycia typu `never`: | ||
| #### Funkcja, która zawsze rzuca błąd | ||
| ```typescript | ||
| function error(message: string): never { | ||
| throw new Error(message); | ||
| } | ||
|
|
||
| function fail(): never { | ||
| return error("Something failed"); | ||
| } | ||
| ``` | ||
| Funkcja `error()` nigdy nie zwróci wartości. Zawsze zatrzyma program, rzucając błędem | ||
|
|
||
| #### Funkcja z nieskończoną pętlą | ||
| ```typescript | ||
| function infiniteLoop(): never { | ||
| while (true) {} | ||
| } | ||
| ``` | ||
| Funkcja wpadnie w pętlę, z której nie ma wyjścia. Nigdy nie zakończy swojego działania. | ||
|
|
||
| #### Sprawdzanie kompletności obsługi wariantów (Exhaustive Check) | ||
| ```typescript | ||
| type Shape = 'circle' | 'square'; | ||
|
|
||
| function getArea(shape: Shape): number { | ||
| switch (shape) { | ||
| case 'circle': | ||
| return Math.PI * 2; | ||
| case 'square': | ||
| return 4; | ||
| default: | ||
| // Jeśli dodasz nowy kształt, taki jak 'triangle', | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tutaj też w komentarzach zmieniłbym formę. dodasz -> dodamy, itd |
||
| // do typu, TypeScript wyświetli tutaj błąd, | ||
| // ponieważ nowy kształt nie może być przypisany do never | ||
| const exhaustiveCheck: never = shape; | ||
| return exhaustiveCheck; | ||
| } | ||
| } | ||
| ``` | ||
| Typ `never` świetnie pilnuje, czy switch obsługuje wszystkie warianty typu. | ||
|
|
||
| ## Kiedy i co wybrać? | ||
| - **unknown** – używaj, gdy nie znasz typu danych (np. odpowiedź z API). To bezpieczny wybór, który wymusza weryfikację typu przed użyciem. | ||
| - **any** – najlepiej unikać `any` całkowicie. Wyłącza ono sprawdzanie typów, co jest głównym celem TypeScriptu. Włącz w konfiguracji tryb strict, a dla nieznanych typów stosuj bezpieczniejszy `unknown`. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| - **never** – używaj, by zaznaczyć, że dany kod jest nieosiągalny. Świetne do funkcji rzucających błędy i do pilnowania kompletności switcha. | ||
|
|
||
| ## Dokumentacja | ||
| - [TypeScript: any](https://www.typescriptlang.org/docs/handbook/basic-types.html#any) | ||
| - [TypeScript: unknown](https://www.typescriptlang.org/docs/handbook/basic-types.html#unknown) | ||
| - [TypeScript: never](https://www.typescriptlang.org/docs/handbook/basic-types.html#never) | ||
| - [Mimo: never](https://mimo.org/glossary/typescript/never) | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. jbc sam to w canvie utworzyłem
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. poprawie bo logo ts musi być bardziej przesunięte do lewej |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
data się jeszcze zmieni