Верификация неизвестных типов с использованием type guards... | Вопросы для собеседования | Skilio
Верификация неизвестных типов с использованием type guards и Zod
Вопрос:

Как можно гарантировать, что переменная типа unknown является переменной определенного типа перед её использованием в TypeScript?

Подсказки:

  • Рассмотрите использование type guards TypeScript для проверки типа во время выполнения.
  • Подумайте об использовании type assertions но с учетом того, что они обходят проверку типов TypeScript.

Превосходя ожидания:

  • Как библиотеки, такие как Zod, могут помочь в проверке типа и валидации во время выполнения.
  • Понятие пользовательских type guards и как их можно использовать для создания пользовательских проверок во время выполнения.
  • Понимание роли и ограничений приведения типов (type assertions) (ключевое слово as ) и как они отличаются от type guards.
Ответ:

В TypeScript, работа с переменной типа unknown требует, что она имеет определённый тип перед её использованием. Поскольку unknown является более безопасной альтернативой any, которая предотвращает случайное использование без надлежащих проверок. Вот стратегии для достижения этого:

Type Guards

Type Guards — это функции или выражения, которые выполняют проверки во время выполнения, чтобы убедиться, что переменная имеет определённый тип. Они имеют решающее значение при работе с типами unknown.

Пользовательские Type Guards

Создайте пользовательские функции, которые определяют тип переменной. Функция пользовательского Type Guard возвращает булево значение и использует специальный предикат возвращаемого типа (variable is Type), чтобы проинформировать TypeScript о типе переменной после проверки.

function isString(value: unknown): value is string {
  return typeof value === 'string';
}

let unknownValue: unknown = "Hello, TypeScript";

if (isString(unknownValue)) {
  // TypeScript теперь знает, что unknownValue — это строка
  console.log(unknownValue.toUpperCase());
}

Type Assertions (приведение типов)

Type Assertions позволяют переопределить выведенную TypeScript систему типов, используя ключевое слово as. Хотя они полезны, их следует использовать с осторожностью, так как они обходят проверку типов и могут привести к ошибкам во время выполнения, если используются неправильно.

Использование Type Assertions

let unknownValue: unknown = "Hello, TypeScript";

// Используйте type assertion с осторожностью
let stringValue: string = unknownValue as string;

// Продолжайте операции, предполагая, что тип верен
console.log(stringValue.toUpperCase());

Библиотеки, такие как Zod

Zod — это библиотека для декларации схем и валидации данных, ориентированная на TypeScript. Она позволяет определять схемы для ваших данных и выполнять проверки как на этапе компиляции, так и на этапе выполнения.

Использование Zod для проверки во время выполнения

import { z } from 'zod';

const stringSchema = z.string();

let unknownValue: unknown = "Hello, TypeScript";

const result = stringSchema.safeParse(unknownValue);
if (result.success) {
  // TypeScript теперь знает, что result.data — это строка
  console.log(result.data.toUpperCase());
}

Понимание Различий

  • Type Guards: Они обеспечивают безопасный и явный способ сузить типы во время выполнения. Они предпочтительнее для обеспечения безопасности типов и избежания ошибок во время выполнения.
  • Type Assertions: Они обходят проверки типов и должны использоваться только тогда, когда вы уверены в типе значения. Они не выполняют никакой проверки во время выполнения.

Пример с типом unknown

function processUnknown(input: unknown) {
  if (typeof input === 'number') {
    console.log(input.toFixed(2)); // TypeScript знает, что input — это число
  } else if (isString(input)) {
    console.log(input.toUpperCase()); // Используем пользовательскую функцию Type Guard
  } else {
    console.log("Неизвестный тип");
  }
}

processUnknown("Hello");
processUnknown(42);

Комбинируя Type Guards, библиотеки, такие как Zod, и Type Assertions, вы можете эффективно управлять переменными типа unknown, гарантируя, что они безопасно используются в качестве конкретных типов в приложениях TypeScript.

0
TypeScript Новичок Опубликовано
© Skilio, 2025
Условия использования
Политика конфиденциальности
Мы используем файлы cookie, для персонализации сервисов и повышения удобства пользования сайтом. Если вы не согласны на их использование, поменяйте настройки браузера.