Що означає тип unknown?
Що означає тип unknown в TypeScript
Тип unknown - це безпечна альтернатива типу any.
Він означає:
«Тип значення невідомий заздалегідь, і перш ніж використовувати його, потрібно перевірити тип (звуження типу).»
Іншими словами - unknown говорить TypeScript:
«Я не знаю, що це за значення, але хочу безпечно з ним працювати.»
Приклад базового використання
javascript
let value: unknown;
value = 42;
value = "Привіт";
value = { name: "Tim" };
value = true;Так можна присвоювати unknown будь-яке значення,
але не можна використовувати його без перевірки.
У чому відмінність від any
| Операція | any | unknown |
|---|---|---|
| Можна присвоювати будь-які значення | так | так |
| Можна виконувати будь-які операції | так | ні (потрібно перевірити тип) |
| Безпека типів | ні | так |
| Потрібно звужувати тип перед використанням | ні | так |
Приклад:
javascript
let a: any = 10;
a.toUpperCase(); // помилка з'явиться тільки під час виконання
let b: unknown = 10;
// b.toUpperCase(); // помилка на етапі компіляції - TypeScript не знає, що це рядокЩоб використати unknown, потрібно спочатку перевірити тип:
javascript
if (typeof b === "string") {
console.log(b.toUpperCase()); // тепер можна
}Приклади використання unknown
1. При роботі із зовнішніми даними (наприклад, API)
javascript
function parseJSON(input: string): unknown {
return JSON.parse(input);
}
const result = parseJSON('{"name": "Tim"}');
// console.log(result.name); // не можна
if (typeof result === "object" && result !== null && "name" in result) {
console.log((result as { name: string }).name); // безпечно
}2. При динамічних типах даних
javascript
function handleInput(data: unknown) {
if (typeof data === "number") {
console.log(data.toFixed(2));
} else if (typeof data === "string") {
console.log(data.toUpperCase());
} else {
console.log("Невідомий тип");
}
}Особливості типу unknown
unknown- це супертип усіх типів, тобто йому можна присвоїти що завгодно:
javascript
let x: unknown;
x = 123;
x = "рядок";
x = true;- Але навпаки - не можна присвоїти
unknownзмінній іншого типу без перевірки:
javascript
let y: number;
let x: unknown = 10;
// y = x; // помилка - потрібно явно звузити або привести тип
y = x as number; // коректно- Тип
unknown- "верхній" тип системи типів TypeScript (аналогany, але безпечний):
javascript
never ⊂ string ⊂ unknownПриклад: порівняння unknown і any
javascript
function testAny(value: any) {
value.foo.bar(); // компілюється, але вибухне в рантаймі
}
function testUnknown(value: unknown) {
// value.foo.bar(); // помилка під час компіляції - безпечно
if (typeof value === "object" && value !== null) {
console.log("Об'єкт:", value);
}
}Коротка зведена таблиця
| Властивість | Опис |
|---|---|
| Тип | Примітивний службовий |
| Призначення | Безпечний аналог any |
| Можна присвоїти | Будь-яке значення |
| Можна використовувати | Лише після перевірки типу |
| Типізація | Строга та безпечна |
| Де використовується | Невідомі дані (API, JSON.parse, введення користувача) |
Підсумок
any- "Роби що хочеш, TypeScript не перевіряє."unknown- "Ти можеш зберігати що завгодно, але доведи, що це безпечно."
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.