Czy wiesz, że TypeScript ma typ bezpieczniejszy niż Any?
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
anycałkowicie. Wyłącza ono sprawdzanie typów, co jest głównym celem TypeScriptu. Włączmy w konfiguracji trybstrict, a dla nieznanych typów stosujmy bezpieczniejszyunknown. - 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
-
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
Podobne wpisy
Jak wykryć i naprawić błędne konfiguracje w działającym klastrze Kubernetes
-
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