Типобезопасная работа с unknown
Сужайте значения unknown, прежде чем безопасно их использовать
«Типобезопасная работа с unknown» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Безопасная работа с неизвестными значениями
Типизация внешних данных как unknown — только половина задачи. Вторая половина — сузить тип до конкретного типа перед использованием. В этом уроке рассматриваются основные методы сужения типа.
function describe(v: unknown): string {
if (typeof v === 'string') return 'string: ' + v;
if (typeof v === 'number') return 'number: ' + v;
return 'other';
}
console.log(describe('hi'), describe(7), describe(true));Сужение типа с помощью проверки типа
Защитная проверка typeof — самый простой инструмент. Она сужает unknown до примитивных типов: string, number, boolean, function, object и других.
function double(v: unknown): number {
if (typeof v === 'number') {
return v * 2; // v is number here
}
return 0;
}
console.log(double(21), double('no'));Сужение типа с помощью проверки экземпляра
Для экземпляров классов используйте instanceof. Он сужает unknown до конкретного класса, безопасно открывая доступ к его методам и свойствам.
function handle(v: unknown): string {
if (v instanceof Date) {
return v.toISOString(); // v is Date
}
return 'not a date';
}
console.log(handle(new Date(0)));Сужение типа с помощью оператора проверки свойств
Оператор in проверяет, существует ли свойство у объекта, и сужает тип значений, являющихся объектами. Сначала убедитесь, что значение — объект, отличный от null, а затем проверьте его ключи.
function getName(v: unknown): string {
if (typeof v === 'object' && v !== null && 'name' in v) {
return String((v as { name: unknown }).name);
}
return 'anonymous';
}
console.log(getName({ name: 'Ada' }), getName(5));Пользовательские проверки типа
Пользовательская проверка типа — это функция, возвращаемый тип которой имеет вид value is T. Когда она возвращает true, TypeScript сужает тип аргумента до T в месте вызова.
function isString(v: unknown): v is string {
return typeof v === 'string';
}
function shout(v: unknown): string {
return isString(v) ? v.toUpperCase() : '?';
}
console.log(shout('hey'), shout(9));Проверки структуры объектов
Пользовательские проверки особенно полезны для проверки структуры объектов. Напишите одну функцию, которая проверяет все обязательные поля, и остальной код сможет доверять суженному типу.
type User = { id: number; name: string };
function isUser(v: unknown): v is User {
return typeof v === 'object' && v !== null &&
'id' in v && 'name' in v;
}
console.log(isUser({ id: 1, name: 'Sam' }), isUser({}));JSON.parse возвращает данные неизвестного типа
Тип результата JSON.parse — any, что незаметно обходит проверки безопасности. Рекомендуемый подход: сохранить результат как unknown и проверить его, прежде чем доверять структуре данных.
function parseConfig(text: string): unknown {
return JSON.parse(text);
}
const raw = parseConfig('{"port":8080}');
console.log(typeof raw);Проверка разобранного JSON
Объедините JSON.parse с проверкой типа, чтобы безопасно преобразовать ненадёжный текст в типизированное значение. Если проверка не пройдена, обработайте ошибку, а не доверяйте некорректным данным.
type Config = { port: number };
function isConfig(v: unknown): v is Config {
return typeof v === 'object' && v !== null &&
'port' in v && typeof (v as any).port === 'number';
}
const data: unknown = JSON.parse('{"port":8080}');
if (isConfig(data)) console.log('Port:', data.port);Цепочка из нескольких проверок
Для сложных входных данных применяйте проверки поэтапно: сначала проверьте общую структуру, затем уточняйте тип. Каждая проверка немного сужает тип, шаг за шагом создавая точные и безопасные типы.
function process(v: unknown): string {
if (Array.isArray(v)) {
if (v.every((x) => typeof x === 'string')) {
return v.join('-');
}
}
return 'invalid';
}
console.log(process(['a', 'b']), process([1, 2]));Выбрасывание ошибки при недопустимых данных
Если проверка обязательных данных не пройдена, выбросьте ошибку. В сочетании со вспомогательной функцией, возвращающей never, это сохраняет основной путь выполнения чистым и корректно типизированным.
function asNumber(v: unknown): number {
if (typeof v === 'number') return v;
throw new Error('Expected a number');
}
console.log(asNumber(42));
try { asNumber('x'); } catch (e) { console.log('rejected'); }Объединяем всё изученное
Полная схема такова: принять данные как unknown, сузить тип с помощью проверок, а затем работать с точным типом. Это безопасная граница между нетипизированным внешним миром и типизированным кодом.
type Point = { x: number; y: number };
function isPoint(v: unknown): v is Point {
return typeof v === 'object' && v !== null &&
'x' in v && 'y' in v;
}
const input: unknown = { x: 1, y: 2 };
if (isPoint(input)) console.log(input.x + input.y);Быстрая проверка
Проверьте, насколько хорошо Вы понимаете безопасную работу с неизвестными значениями.
Повторение: обработка неизвестных значений
Вы научились сужать unknown с помощью:
typeofдля примитивов иinstanceofдля экземпляров классов.- Оператора
inдля свойств объектов. - Пользовательских проверок типа, возвращающих
value is T. - Проверки результатов
JSON.parseперед тем, как им доверять.
Следующий курс: утверждения типов и приведение типов.
function isNonEmpty(v: unknown): v is string {
return typeof v === 'string' && v.length > 0;
}
console.log(isNonEmpty('hi'), isNonEmpty(''));Изучай TypeScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 101
- Уроки
- 352
Часто задаваемые вопросы
Урок «Типобезопасная работа с unknown» бесплатный?
Да — полный текст урока «Типобезопасная работа с unknown» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Типобезопасная работа с unknown»?
Сужайте значения unknown, прежде чем безопасно их использовать Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Типобезопасная работа с unknown»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понимание unknown и any
- Тип never и невозможные состояния
- Тип void в функциях
- Типобезопасная работа с unknown