В TypeScript тип unknown — это безопасный аналог типа any. Если переменной присвоен тип any, вы можете делать с ней что угодно (вызывать методы, обращаться к свойствам), и компилятор не будет возражать, даже если это приведет к ошибке во время выполнения.
Тип unknown работает иначе: вы можете присвоить ему любое значение, но не можете использовать это значение (вызывать методы, передавать в функции, ожидающие другой тип), пока не убедитесь в его реальном типе. Это заставляет вас писать код проверки типов (Type Guards), делая программу надежнее.
Пример использования:
let value: unknown = "hello";
// value.length; // Ошибка! Нельзя просто так обратиться к свойству
if (typeof value === "string") {
console.log(value.length); // Теперь можно, TS знает, что это строка
}
Этот урок поможет освоить безопасную типизацию данных, когда их структура заранее неизвестна.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 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. Any vs Unknown
В левой колонке приведены описания поведения и характеристик типов TypeScript, связанных с безопасностью типов и проверками. В правой колонке указаны названия типов. Сопоставьте каждое описание слева с соответствующим типом справа. Обратите внимание, что в правой колонке есть повторяющиеся названия типов, поэтому в проверке учитываются все корректные варианты сопоставления по смыслу.
2. Объявление unknown
Дополните фрагмент кода на TypeScript, объявив переменную с типом unknown. Этот тип позволяет переменной хранить значения любого типа, но перед выполнением операций над ней требуется явная проверка типа. Вставьте ключевое слово в аннотацию типа так, чтобы код компилировался и соответствовал безопасной работе с динамическими значениями.
let userData: input1S;
userData = fetchDataFromSource(); // функция возвращает неизвестные данные
if (typeof userData === 'string') {
console.log(userData.toUpperCase());
}3. Ошибка доступа
В этом фрагменте кода TypeScript переменная unknownValue имеет тип unknown. В одной из строк происходит попытка вызвать метод toUpperCase() без предварительной проверки типа, что приводит к ошибке компиляции. Найдите эту строку и исправьте её, используя утверждение типа (type assertion), чтобы код успешно выполнился.
let unknownValue: unknown = "Hello, World!";// Небезопасное использование unknownlet result = unknownValue.toUpperCase();console.log(result);4. Сужение типов
В данном задании вам предстоит заполнить пропуски в коде TypeScript, чтобы корректно сузить тип переменной unknown перед её использованием. Выберите из выпадающих списков правильные операторы проверки типа (typeof) и соответствующие типы (string, number), чтобы код выполнялся без ошибок типизации. Обратите внимание, что после проверки TypeScript позволяет использовать методы, специфичные для суженного типа.
let value: unknown = getSomeValue(); // Возвращает unknown
if (input1S value input2S) {
// value теперь сужено до string
console.log(value.toUpperCase());
} else if (input3S value input4S) {
// value теперь сужено до number
console.log(value.toFixed(2));
} else {
console.log('Тип не поддерживается');
}5. Результат проверки
Проанализируйте приведённый код на TypeScript. Переменная value имеет тип unknown и инициализирована числом 42. Определите, что будет выведено в консоль в результате выполнения этого кода. Обратите внимание на проверку типа с помощью typeof и поведение метода toFixed().
let value: unknown = 42;
if (typeof value === 'string') {
console.log(value.toUpperCase());
} else if (typeof value === 'number') {
console.log(value.toFixed(1));
}6. Безопасная функция
Из предложенных строк соберите корректную функцию на TypeScript, которая принимает аргумент типа unknown, проверяет, является ли он числом, и возвращает его удвоенное значение. Если аргумент не число, функция должна возвращать 0. В решении должны быть использованы только необходимые строки, лишние включать не нужно. Обратите внимание на правильную структуру функции и порядок операторов.
function doubleIfNumber(value: unknown): number { if (typeof value === 'number') { return value * 2; } return 0;} const num = value as number; console.log(value); else { return 0; }