Kodokon kodokon.com

Вывод типов, any и unknown

Позволь TypeScript определять типы самому благодаря выводу типов и пойми, почему unknown лучше опасного any.

8 мин · 3 вопросов

Открыть этот урок в Kodokon

Хорошая новость: аннотировать каждую переменную не обязательно. Благодаря выводу типов TypeScript сам определяет тип переменной по значению, которое ты ей даёшь. Достаточно написать let city = "Lyon": TypeScript знает, что city - это string, и защищает её так же, как если бы ты поставил аннотацию.

TYPESCRIPT
let city = "Lyon"; // inferred type: string
let count = 3;     // inferred type: number

count = count + 1; // accepted
// city = 42; -> error: city is still a string
Ни одной аннотации, а типы всё равно на месте.

Тип any означает «что угодно». Переменная типа any ускользает от всех проверок: TypeScript принимает всё подряд, ничего не проверяя. Это как снять ремень безопасности: код компилируется, но ошибки возвращаются во время выполнения - ровно то, что TypeScript должен был предотвратить.

TYPESCRIPT
let data: any = "hello";
data = 42; // accepted without complaint

// Compiles, but crashes at runtime:
// data.toUpperCase() does not exist on a number!
С any TypeScript смотрит в другую сторону.

Для значения, тип которого действительно неизвестен (ответ сервера, ввод пользователя), выбирай unknown. Как и any, он принимает любое значение, но заставляет тебя проверить тип (например через typeof), прежде чем его использовать. Поэтому безопасность остаётся нетронутой.

TYPESCRIPT
let value: unknown = "hello";

// console.log(value.toUpperCase()); -> rejected!

if (typeof value === "string") {
  console.log(value.toUpperCase()); // "HELLO"
}
unknown требует проверки перед использованием.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Что такое вывод типов?
    • TypeScript сам определяет тип по начальному значению
    • TypeScript убирает типы из программы
    • TypeScript превращает числа в тексты
  2. Почему any стоит избегать насколько возможно?
    • Он замедляет работу программы
    • Он отключает проверки TypeScript
    • Он запрещён языком
    • Он работает только с числами
  3. Что нужно сделать, прежде чем использовать значение типа unknown?
    • Проверить его тип, например через typeof
    • Преобразовать его в any
    • Объявить его второй раз