consdata.com
Blog techniczny Blog biznesowy Dział HR
EN
typescript

Czy wiesz, że TypeScript ma typ bezpieczniejszy niż Any?

author Wojciech Stolarski
3 grudnia 2025

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.

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żemy potem z tym zrobić, nieco się różni.

Typ any – “nie wiemy i nie interesuje nas to”

Typ any wyłącza sprawdzanie typów dla danej zmiennej w TypeScript. Kompilator nie sprawdza, co przypisujemy i jak używamy tej zmiennej. Możemy zrobić z nią wszystko, a ewentualny błąd zobaczymy dopiero w trakcie działania aplikacji.

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 wiemy, ale sprawdzimy”

Typ unknown jest bezpieczniejszą alternatywą dla any. Możemy przypisać dowolną wartość, ale TypeScript wymaga, by przed użyciem sprawdzić typ tej zmiennej. Dzięki temu nie popełnimy błędu w runtime.

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

function error(message: string): never {
  throw new Error(message);
}

function fail(): never {
  return error("Something failed");
}

Funkcja error() nigdy nie zwraca wartości. Zawsze zatrzymuje program, rzucając błędem.

Funkcja z nieskończoną pętlą

function infiniteLoop(): never {
  while (true) {}
}

Funkcja wpada w pętlę, z której nie ma wyjścia. Nigdy nie kończy swojego działania.

Sprawdzanie kompletności obsługi wariantów (Exhaustive Check)

type Shape = 'circle' | 'square';

function getArea(shape: Shape): number {
  switch (shape) {
    case 'circle':
      return Math.PI * 2;
    case 'square':
      return 4;
    default:
      // Jeśli dodamy nowy kształt, taki jak 'triangle', 
      // 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żywajmy, gdy nie znamy typu danych (np. odpowiedź z API). To bezpieczny wybór, który wymusza weryfikację typu przed użyciem.
  • any – najlepiej unikajmy any całkowicie. Wyłącza ono sprawdzanie typów, co jest głównym celem TypeScriptu. Włączmy w konfiguracji tryb strict, a dla nieznanych typów stosujmy bezpieczniejszy unknown.
  • never – używajmy, by zaznaczyć, że dany kod jest nieosiągalny. Świetne do funkcji rzucających błędy i do pilnowania kompletności switcha.

Dokumentacja

  • TypeScript: any
  • TypeScript: unknown
  • TypeScript: never
  • Mimo: never
Najnowsze wpisy

  • Czy wiesz, że TypeScript ma typ bezpieczniejszy niż Any?
  • Czy wiesz, że za pomocą operatora shareReplay możesz cache'ować dane z observable?
  • Jak wykryć i naprawić błędne konfiguracje w działającym klastrze Kubernetes
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

newsletter

techniczny

Zapisz się

Podobne wpisy

post-image
typescript

Czy wiesz, że TypeScript ma typ bezpieczniejszy niż Any?

author
Wojciech Stolarski 3 gru 2025
post-image
rxjs

Czy wiesz, że za pomocą operatora shareReplay możesz cache'ować dane z observable?

author
Piotr Tatarski 17 lis 2025
post-image
kubernetes

Jak wykryć i naprawić błędne konfiguracje w działającym klastrze Kubernetes

author
Bartłomiej Domżalski 26 wrz 2025
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

Zapisz się na

newsletter

techniczny

consdata.com
  • Kontakt

    • sales@consdata.com
    • +48 61 41 51 000

  • Biuro

    • K9Office
      Krysiewicza 9/14
      61-825 Poznań
      Polska

  • Rozwiązania

    • Eximee
    • Kouncil
  • Blog Dołącz do nas
Copyright © 2024 Consdata. All rights reserved. Privacy Policy & Cookies
Chcemy używać plików cookie oraz skryptów podmiotów trzecich do polepszania funkcjonowania tej strony Zgadzam się