TypeScript Academy · Урок

Тип any и почему его стоит избегать

Разберитесь в типе any и в том, как он сводит на нет преимущества TypeScript.

Урок 2 из 413 шагов

«Тип any и почему его стоит избегать» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Добро пожаловать

Тип `any` — это аварийный выход в TypeScript: он отключает проверку типов для переменной. В этом уроке Вы узнаете, когда он появляется и почему его использование следует сводить к минимуму.

Что делает any

Переменная типа `any` может содержать любое значение и поддерживает любую операцию. TypeScript полностью прекращает её проверять.
let x: any = 5;
x = 'hello';       // OK
x = true;          // OK
x.nonExistent();   // No error — but crashes at runtime!

Как any распространяется по коду

Присваивание переменной типа `any` переменной с определённым типом «заражает» эту переменную. `any` незаметно распространяется по всей кодовой базе.
let data: any = fetchData();
let name: string = data.name; // name is now effectively any

Когда TypeScript выводит any

Если Вы объявляете переменную без начального значения и аннотации типа, TypeScript выводит тип `any`. Включите `noImplicitAny`, чтобы такая ситуация считалась ошибкой компиляции.
let value; // inferred as any — dangerous!
value = 42;
value = 'hello';

// Fix:
let value2: number;

Флаг noImplicitAny

Параметр компилятора `noImplicitAny` (включаемый параметром `strict`) заставляет Вас явно указывать типы, а не использовать `any` по умолчанию.
// tsconfig.json
{ "compilerOptions": { "noImplicitAny": true } }

// Now this is an error:
function process(data) { } // Error: Parameter has implicit any type

Допустимые случаи использования any

Иногда `any` неизбежен: при переносе JavaScript, работе со сторонними библиотеками без типов или с действительно динамическими данными. Используйте его редко и только в ограниченной области кода.
// Acceptable: narrow scope, clearly documented
function parseJson(raw: string): any {
  return JSON.parse(raw); // validate with Zod afterwards
}

Утверждения типов как альтернатива

Вместо `any` используйте утверждения типов (as Type), когда Вы знаете о типе больше, чем компилятор. Это безопаснее, поскольку Вы явно выбираете конкретный тип.
const raw = JSON.parse(text) as { name: string; age: number };
console.log(raw.name); // typed correctly

any и object

Тип `object` принимает любое непримитивное значение, но, в отличие от `any`, не разрешает произвольный доступ к свойствам. Это даёт дополнительный, пусть и небольшой, уровень безопасности.
let o: object = { x: 1 };
// o.x; // Error — object doesn't allow property access

let a: any = { x: 1 };
a.x; // OK — but no safety

any отключает автодополнение

Помимо снижения безопасности, использование `any` отключает автодополнение и навигацию в интегрированной среде разработки. Вы теряете все преимущества инструментов TypeScript.

Замена any на unknown

Для внешних данных, которыми Вы не управляете, предпочитайте `unknown`. Он заставляет сначала сузить тип, прежде чем использовать значение, тогда как `any` позволяет делать с ним что угодно.
let input: unknown = getInput();
// input.toUpperCase(); // Error — must narrow first
if (typeof input === 'string') {
  console.log(input.toUpperCase()); // OK
}

Бюджет any

Считайте `any` долгом. Каждое его использование снижает безопасность кодовой базы. Стремитесь не использовать тип `any` в рабочем коде. Применяйте правило ESLint @typescript-eslint/no-explicit-any.

Быстрая проверка

Какой параметр компилятора заставляет TypeScript сообщать об ошибке, если переменная неявно получает тип `any`?

Итоги

Тип `any` отключает проверку типов TypeScript и распространяется по коду. Включите noImplicitAny, заменяйте `any` на `unknown` для внешних данных, а в отдельных случаях используйте утверждения типов.
Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
101
Уроки
352

Часто задаваемые вопросы

Урок «Тип any и почему его стоит избегать» бесплатный?

Да — полный текст урока «Тип any и почему его стоит избегать» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Тип any и почему его стоит избегать»?

Разберитесь в типе any и в том, как он сводит на нет преимущества TypeScript. Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Тип any и почему его стоит избегать»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Примитивные типы: string, number, boolean
  2. Тип any и почему его стоит избегать
  3. unknown и any: более безопасный выбор
  4. null, undefined и строгая проверка на null
← Назад к TypeScript Academy