Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

data się jeszcze zmieni

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.

Choose a reason for hiding this comment

The 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.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wydaje mi się, że powinniśmy stosować formę wieloosobową lub bezosobową.
przypisujesz → przypisujemy, ew. jest przypisywane.

Jest niespójność. Raz tekst jest w pierwszej osobie raz w liczbie mnogiej

Copy link
Contributor Author

Choose a reason for hiding this comment

The 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',
Copy link
Contributor

Choose a reason for hiding this comment

The 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`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

strict zamiast strict

- **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)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jbc sam to w canvie utworzyłem

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

poprawie bo logo ts musi być bardziej przesunięte do lewej

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading