Отказ от any; предпочтение unknown и сужения типов
Заменяйте any на unknown с последующим сужением типов; добавляйте небольшие защиты и функции-утверждения; постепенно включайте флаги строгости, не нарушая сборку.
«Отказ от any; предпочтение unknown и сужения типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 2. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 2 уроков всего.
Введение
Цель: устранить участки с произвольными типами. Предпочитайте неизвестный тип для ненадежных значений и сужайте его с помощью простых проверок. Вы добавите небольшие проверки и поэтапно включите строгие флаги.
- произвольный тип → неизвестный тип
- сужение с помощью typeof/in/instanceof
- функции-утверждения
Проблемы произвольного типа
any отключает безопасность: значения неправильной формы или арифметика со строками проходят компиляцию, но приводят к сбоям позже.
// any hides bugs
function avgBad(values: any): number {
// Compiles even if values is not an array of numbers
return values.reduce((a: number, b: number) => a + b, 0) / values.length
}
// Runtime crash examples:
// avgBad(123)
// avgBad(["1","2"]) // string addition!Неизвестный тип и сужение типов
Используйте unknown для данных, поступающих извне. Сужайте тип с помощью Array.isArray и typeof, а затем безопасно выполняйте вычисления.
// unknown forces checks
function avg(values: unknown): number {
if (!Array.isArray(values)) throw new Error("values must be an array")
const nums = values.filter((v): v is number => typeof v === "number")
if (nums.length === 0) throw new Error("no numbers")
const sum = nums.reduce((a, b) => a + b, 0)
return sum / nums.length
}
// avg([1,2,3]) → 2; avg("oops") throws early with a clear messageПроверки типов
Создайте предикат x is T, чтобы корректно сужать тип в вызывающем коде. Делайте проверки небольшими и сосредоточенными на структурных признаках.
// Small predicate to reuse narrowing
export type User = { id: string; name: string }
export function isUser(x: unknown): x is User {
return typeof x === "object" && x !== null
&& typeof (x as any).id === "string"
&& typeof (x as any).name === "string"
}
export function hello(x: unknown) {
if (!isUser(x)) throw new Error("invalid user")
return `Hello, ${x.name}`
}Функции-утверждения
Функции-утверждения (asserts x is T) сужают тип после выполнения. Используйте их для обязательных предварительных условий и выбрасывайте исключения с понятными сообщениями.
// Assertion function throws or narrows
function assertUser(x: unknown): asserts x is { id: string; name: string } {
if (typeof x !== "object" || x === null) throw new Error("not an object")
const o = x as Record<string, unknown>
if (typeof o.id !== "string" || typeof o.name !== "string") throw new Error("bad user")
}
export function greetUnsafe(x: unknown) {
assertUser(x) // now x is narrowed after this call
return `Hi ${x.name}`
}План повышения строгости
План:
- Включите
noImplicitAnyи сначала исправьте новые ошибки. - Добавьте проверки для внешних входных данных.
- Включите
strictNullChecksи явно обработайте значения undefined. - Отслеживайте оставшиеся случаи
anyс помощью ESLint и постепенно сокращайте их.
Проверка неизвестного и произвольного типов
Быстрая проверка: почему для ненадежных данных следует предпочитать unknown, а не any?
Итоги
Итоги: заменяйте any на unknown, добавляйте небольшие проверки или утверждения и поэтапно повышайте строгость, чтобы сборки оставались успешными.
Часто задаваемые вопросы
Урок «Отказ от any; предпочтение unknown и сужения типов» бесплатный?
Да — полный текст урока «Отказ от any; предпочтение unknown и сужения типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 2 уроков всего.
Чему я научусь в уроке «Отказ от any; предпочтение unknown и сужения типов»?
Заменяйте any на unknown с последующим сужением типов; добавляйте небольшие защиты и функции-утверждения; постепенно включайте флаги строгости, не нарушая сборку. Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 2.
Сколько времени занимает урок «Отказ от any; предпочтение unknown и сужения типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Отказ от any; предпочтение unknown и сужения типов
- Постепенное включение строгих флагов