W TypeScript typy any, unknown i object stosowane są w różnych scenariuszach i mają kluczowe różnice:
any: wyłącza system typów dla zmiennej. Pozwala na wykonywanie dowolnych operacji na zmiennej bez wywoływania błędów kompilacji. Używaj, gdy typ obiektu jest wcześniej nieznany i bezpieczeństwo nie jest krytyczne.unknown: również przyjmuje dowolny typ, ale do pracy z takimi zmiennymi wymagana jest wyraźna walidacja/rzutowanie typów. Bezpieczniejszy niż any. Używaj dla wartości o nieznanym typie, aby nie stracić kontroli nad typowaniem.object: typ tylko dla obiektów nieprymitywnych (obiekty, tablice, funkcje), ale nie dla prymitywów (liczby, napisy). Ogranicza pracę wyłącznie do obiektów.let a: any = 1; a = 'string'; // OK a(); // OK (ale może prowadzić do błędu w czasie wykonania) let b: unknown = 'hello'; b = 5; // OK // b.toUpperCase(); // Błąd — wymagana walidacja typu if (typeof b === 'string') { console.log(b.toUpperCase()); } let c: object = { key: 'value' }; c = [1, 2, 3]; // OK // c = 1; // Błąd, ponieważ '1' nie jest obiektem
Pytanie: Jaką korzyść przynosi typ unknown, jeśli możemy używać any?
Odpowiedź: unknown zwiększa bezpieczeństwo kodu — nie będziesz mógł wykonać na zmiennej niezweryfikowanych działań, jak przy any. Konieczne jest wyraźne sprawdzenie lub rzutowanie typu, co wyklucza wiele niespodzianek podczas wykonania.
function handle(value: unknown) { // value.trim(); // Błąd if (typeof value === 'string') { value.trim(); } }
Historia
Na projekcie zdecydowano się na szybkie zintegrowanie zewnętrznej biblioteki, opisując jej wynik przez any, aby nie martwić się o typy. W wyniku tego w czasie wykonania odkryto, że biblioteka zwracała nie tablicę, ale obiekt z polami, co spowodowało masowe błędy metody .map() — ten kod kompilował się, ale zawodził podczas wykonania.
Historia
Jeden z programistów użył unknown dla danych, które przyszły z backendu, ale nie dodał walidacji typu przed pracą z polami. W rezultacie TypeScript nie skompilował kodu — i trzeba było szybko zamienić na any, co ukryło potencjalne błędy parsowania i doprowadziło do błędów w produkcji z powodu niepoprawnego formatu danych.
Historia
Podczas pracy z typem object wystąpiło zamieszanie: próbowano przypisać zmiennej typu object wartości string i number. Chociaż na etapie rozwoju nie dostrzegano podchwytliwości, w trakcie przeglądu ujawniono błędy związane z tym, że metody obiektu nie działały z prymitywami. Na naprawę poświęcono dodatkowy czas.