Oba mogą przechowywać dowolną wartość, ale różnią się bezpieczeństwem. any wyłącza sprawdzanie typu; unknown je włącza i zmusza do zawężenia zakresu przed użyciem.
ts
let a: any = "hello";
a.foo.bar; // ✅ compiles — no checking at all (may crash at runtime)
a(); // ✅ compiles — TypeScript trusts you blindly
let u: unknown = "hello";
u.toUpperCase(); // ❌ Error: object is of type 'unknown'
u(); // ❌ Error — must narrow first
unknown wymusza sprawdzenie przed użyciem
ts
function handle(input: unknown) {
if (typeof input === "string") {
input.toUpperCase(); // ✅ inside the guard, TS knows it's a string
}
}
unknown jest bezpiecznym względem typu odpowiednikiem any: możesz przypisać cokolwiek do niego, ale nie możesz zrobić nic z nim, dopóki nie udowodnisz, czym jest, poprzez strażnika typu.
Kiedy używać którego
unknown— dla wartości naprawdę nieznanego typu na granicy: wynikiJSON.parse, odpowiedzi API,catch (e: unknown). Zmusza do walidacji.any— wyjście awaryjne podczas migracji JavaScript lub gdy naprawdę nie możesz czegoś wytypować. Używaj oszczędnie; rozprzestrzenia się cicho i wyłącza bezpieczeństwo.
Dlaczego to ważne
Sięgnięcie po any udaremnia cel TypeScript.
Woleć unknown na niezatypizowanych granicach — utrzymuje gwarancje kompilatora, jednocześnie akceptując dowolne dane wejściowe, zmuszając cię do walidacji danych przed zaufaniem im.
