programowanieFrontend-developer

Opisz różnice między typami any, unknown i object w TypeScript. Kiedy warto używać każdego z nich? Podaj przykłady kodu.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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.

Przykład kodu:

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 z podchwytliwością.

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(); } }

Przykłady rzeczywistych błędów z powodu nieznajomości niuansów tematu.


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.