Работа с типами объединения
Часть раздела Введение в TypeScript путешествия по JavaScript на Coddy. Урок 32 из 73.
Когда вы работаете с объединениями типов (union types), TypeScript применяет важное правило безопасности: вы можете обращаться только к тем свойствам и методам, которые существуют во всех типах данного объединения. Это предотвращает ошибки во время выполнения, но означает, что вам нужны специальные техники для доступа к возможностям, специфичным для конкретных типов.
Рассмотрим функцию, которая принимает либо строку, либо массив строк. Оба типа имеют свойство length, поэтому вы можете безопасно обращаться к нему:
function getLength(input: string | string[]): number {
return input.length; // Безопасно — оба типа имеют свойство length
}Однако, если вы попытаетесь использовать метод, который существует только в одном типе, TypeScript выдаст ошибку. Чтобы безопасно обращаться к членам, специфичным для конкретного типа, вам понадобится type guard (сужение типа) — проверка во время выполнения, которая сужает тип:
function processInput(input: string | string[]): void {
if (typeof input === "string") {
// Здесь TypeScript знает, что input — это строка
console.log(input.toUpperCase());
} else {
// Здесь TypeScript знает, что input — это string[]
console.log(input.join(", "));
}
}Оператор typeof является одним из наиболее распространенных защитников типов (type guards). После проверки TypeScript автоматически сужает тип внутри каждой ветки, предоставляя вам полный доступ к свойствам и методам, специфичным для типа, при сохранении полной типобезопасности.
Задание
ЛегкоСоздайте функцию с именем processData, которая принимает параметр input типа string | string[] и возвращает number. Функция должна использовать защитник типа (type guard) для определения типа входных данных и вести себя следующим образом:
- Если входные данные — это
string, верните их длину - Если входные данные — это
string[], верните общее количество символов во всех строках массива
Создайте еще одну функцию с именем formatMessage, которая принимает параметр content типа number | boolean и возвращает string. Функция должна использовать защитник типа (type guard) для определения типа входных данных и вести себя следующим образом:
- Если входные данные — это
number, верните"Value: [number]" - Если входные данные — это
boolean, верните"Status: [boolean]"
Будут предоставлены следующие входные данные:
- Первый ввод: строка, представляющая собой либо одно слово, либо JSON-массив строк, например
["apple", "banana", "cherry"] - Второй ввод: строка, представляющая собой либо число, либо логическое значение (
"true"или"false")
Обработайте входные данные следующим образом:
- Для первого ввода: если он начинается с
"[", распарсите его как JSON-массив строк; в противном случае рассматривайте его как обычную строку - Для второго ввода: если это
"true"или"false", преобразуйте его в логическое значение (boolean); в противном случае преобразуйте его в число
Вызовите processData с обработанным первым вводом и выведите результат. Затем вызовите formatMessage с обработанным вторым вводом и выведите результат.
Попробуйте сами
import * as fs from "fs";
// Чтение входных данных
const stdinBuffer: Buffer = fs.readFileSync(0);
const inputs: string[] = stdinBuffer.toString().trim().split('\n');
const firstInput = inputs[0];
const secondInput = inputs[1];
// TODO: Напишите свой код здесь
// Создайте функцию processData с защитником типа (type guard)
// Создайте функцию formatMessage с защитником типа (type guard)
// Обработайте входные данные в соответствии с требованиями
// Вызовите функции и выведите результатыВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в TypeScript
1Начало работы с TS
Что такое TypeScript?Зачем использовать TypeScript?Ваш первый код на TypeScriptПроцесс компиляции и ошибкиИтоги: Введение в TS4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация стрелочных функцийТип возвращаемого значения 'void'Необязательные параметры с '?'Значения параметров по умолчаниюТипизация Rest-параметровОпределение типов функцийИтоги: Создание типизированных функций2Основные типы
Базовые типы: str, num, booleanТип 'any': лазейкаТип 'unknown'Работа с 'null' и 'undef'Вывод типов в действииЯвные аннотации типовИтоги: Практика по основным типам5Типы: псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения ('|')Работа с типами объединенияЛитеральные типыТипы пересечения ('&')Комбинирование псевдонимов типовИтоги: продвинутые комбинации типов3Структуры данных: массивы и кортежи
Типизированные массивыМодификатор 'readonly' для массивовЧто такое кортеж?Объявление кортежей и доступ к нимДеструктуризация кортежейКортежи readonlyМногомерные типизированные массивыОператор spread с массивамиИтоги: массивы и кортежиПотренируйтесь самостоятельно: Песочница TypeScript