TypeScript не всегда может автоматически понять, как изменился тип переменной после проверки условия. Для решения этой задачи используются User-Defined Type Guards — пользовательские защитники типа.
Это обычные функции, возвращающие boolean, но имеющие особенную сигнатуру возврата: arg is Type. Например: function isFish(pet: Pet): pet is Fish. Если эта функция возвращает true, TypeScript сужает тип переменной pet до Fish внутри соответствующего блока кода. Это ключевой механизм для безопасной работы с объединениями типов (Union Types) в разработке.
Вас ждут задания на написание правильных предикатов типов. Вы научитесь синтаксису is, узнаете, где его применять и как избежать ошибок при написании логики проверки. Эти навыки необходимы для написания надежного кода без лишних приведений типов (as).
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- typeof guard.
- Truthiness narrowing.
- Equality narrowing.
- in operator narrowing.
- instanceof guard.
- Пользовательские Type Guards (is).
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Синтаксис предиката is
В этом задании вам нужно дополнить сигнатуру функции-гарда, которая проверяет, является ли переданный аргумент строкой. В TypeScript для создания пользовательской функции-гарда используется специальный синтаксис с предикатом типа. В предоставленном коде пропущено ключевое слово, которое связывает параметр с типом в возвращаемом значении. Вставьте правильное ключевое слово, чтобы функция корректно сужала тип переменной.
function isString(value: any): value input1S string {
return typeof value === 'string';
}
const testValue: unknown = 'Hello';
if (isString(testValue)) {
console.log(testValue.toUpperCase()); // Без ошибки типов
}2. Ошибка в типе возврата
В этом фрагменте TypeScript-кода определена пользовательская type guard функция, которая проверяет, является ли переданное значение строкой. Однако из-за неправильного типа возврата (просто boolean вместо предиката типа) сужение типа внутри условия if не работает, и код вызывает ошибку компиляции. Исправьте тип возврата функции, чтобы TypeScript мог корректно сузить тип переменной внутри блока условия.
function isString(value: unknown): boolean { return typeof value === 'string';} function processValue(value: unknown) { if (isString(value)) { console.log(value.toUpperCase()); }}3. Применение гарда
В данном фрагменте кода TypeScript используется пользовательская функция-гард (type guard) для проверки типа переменной. Вам необходимо выбрать правильное имя функции-гарда и имя переменной, чтобы условие if корректно сузило тип и позволило вызвать метод строки. Обратите внимание на синтаксис вызова функции-гарда и область видимости переменной.
function isString(value: unknown): value is string {
return typeof value === 'string';
}
let data: unknown = "Hello, TypeScript!";
if (input1S(input2S)) {
console.log(data.toUpperCase());
}4. Сборка функции-проверки
Из предложенных строк соберите корректную функцию-гвард (type guard) `isNumber` на TypeScript, которая проверяет, является ли переданное значение числом. Функция должна использовать предикат `value is number` и оператор `typeof` для проверки. В решении должны быть только необходимые строки, лишние строки игнорируйте. Правильная функция состоит из 4 строк: объявление, открывающая фигурная скобка, проверка с возвратом результата, закрывающая фигурная скобка.
function isNumber(value: unknown): value is number { const isNum = typeof value === 'number'; return isNum;}function isString(value: unknown): value is string { return typeof value === 'string';} return true;5. Результат проверки
В приведённом ниже фрагменте кода TypeScript определён пользовательский type guard (гард типа) `isAdmin`, который проверяет, имеет ли переданный объект свойство `role` со значением `'admin'`. Затем создаётся объект `user` и вызывается функция `isAdmin` с этим объектом. Определите, какое значение (`true` или `false`) вернёт функция `isAdmin` для объекта `user`. Введите ответ в поле ниже в виде одного слова — `true` или `false`.
interface User {
name: string;
role?: string;
}
function isAdmin(user: User): user is User & { role: 'admin' } {
return user.role === 'admin';
}
const user: User = {
name: 'Alice',
role: 'user'
};
const result = isAdmin(user);