Menu
CoddyTech

Работа с типами объединения

Часть раздела Введение в 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 автоматически сужает тип внутри каждой ветки, предоставляя вам полный доступ к свойствам и методам, специфичным для типа, при сохранении полной типобезопасности.

challenge icon

Задание

Легко

Создайте функцию с именем 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)
// Обработайте входные данные в соответствии с требованиями
// Вызовите функции и выведите результаты
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в TypeScript

Потренируйтесь самостоятельно: Песочница TypeScript