any vs unknown
any wyłącza sprawdzanie typów i pozwala na wszystko, a unknown też przyjmie każdą wartość, ale wymaga sprawdzenia typu, zanim jej użyjesz.
Porównanie w tabeli
#Przyjmuje każdą wartość
Użycie bez sprawdzenia typu
Wywołanie dowolnej metody
Przypisanie do innego typu bez sprawdzenia
Gdzie błąd wychodzi na jaw
Typowe użycie
Przykład
#function describeAny(value: any): string {
return value.toUpperCase()
}
function describeUnknown(value: unknown): string {
if (typeof value === 'string') return value.toUpperCase()
return 'nieznany typ'
}
console.log(describeAny('html'))
console.log(describeUnknown('css'))
console.log(describeUnknown(42))HTML CSS nieznany typ
Definicja i zastosowanie
#Oba typy przyjmują wartość jakiegokolwiek typu: możesz przypisać do zmiennej any albo unknown napis, liczbę, obiekt czy wynik JSON.parse(). W obu przypadkach kompilator nie wie z góry, czym naprawdę jest ta wartość.
Różnica jest w tym, co wolno zrobić dalej. Na wartości any możesz od razu wywołać dowolną metodę i przekazać ją wszędzie, bez żadnego sprawdzenia, bo kompilator przestaje pilnować typów. Na wartości unknown nie zrobisz nic, dopóki nie zawężysz typu przez typeof, instanceof, Array.isArray() albo własny strażnik typu. Dopiero po takim sprawdzeniu kompilator udostępnia metody właściwe dla rozpoznanego typu.
any to furtka, która wyłącza TypeScript tam, gdzie jej użyjesz, i łatwo przez nią przepuścić błąd do działającego programu. unknown daje tę samą elastyczność przy przyjmowaniu danych, ale zmusza do ich sprawdzenia, więc dla danych z zewnątrz (API, JSON.parse(), localStorage) wybieraj unknown. any zostaw jako tymczasowe rozwiązanie przy migracji z JavaScriptu.
Składnia
#let wartosc: any
let inna: unknownWięcej przykładów
#const broken: any = { user: null }
try {
console.log(broken.user.name)
} catch (error) {
console.log('Błąd w działaniu, kompilator nic nie zgłosił')
}Błąd w działaniu, kompilator nic nie zgłosił
const input: unknown = JSON.parse('{"level":7}')
console.log(input.level)
// Błąd: 'input' is of type 'unknown'.Dobre praktyki
#- Włącz opcję
noImplicitAny, żeby kompilator nie przyjmowałanypo cichu tam, gdzie nie podałeś typu. - Błąd w
catch (error)ma typunknown. Sprawdźerror instanceof Error, zanim odczytaszerror.message. - Jeśli migrujesz kod z
anynaunknown, kompilator sam wskaże każde miejsce, które wymaga sprawdzenia typu.
Powiązane hasła
#- anyTyp wyłączający sprawdzanie: wartość może być czymkolwiek.
- unknownBezpieczny odpowiednik any: wartość nieznanego typu, której trzeba najpierw sprawdzić.
- neverTyp wartości, która nigdy nie wystąpi: funkcji, które nie kończą się normalnie, i niemożliwych przypadków.
- Zawężanie typówUstalanie dokładniejszego typu wartości na podstawie sprawdzeń w kodzie.
- Strażnicy typów (value is T)Własne funkcje sprawdzające, które zawężają typ w miejscu wywołania.
Widzisz błąd albo brakuje przykładu? Napisz do nas.