Avatar ·

Ошибка TypeScript: Type 'string | undefined' is not assignable to type 'string' — как исправить?

Привет! Я только начал изучать TypeScript и столкнулся с ошибкой, которую не могу понять. У меня есть функция, которая принимает строку и возвращает её длину. Но когда я пытаюсь передать в неё значение из объекта, полученного из DOM, TypeScript выдаёт ошибку: ``` Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'. ``` Вот мой код: ```typescript function getLength(text: string): number { return text.length; } const inputElement = document.getElementById('myInput') as HTMLInputElement; const value = inputElement.value; // value имеет тип string | undefined const length = getLength(value); // Ошибка здесь! ``` Я понимаю, что `value` может быть `undefined`, но в реальности поле ввода всегда есть на странице. Почему TypeScript ругается и как правильно обработать эту ситуацию? Подскажите, пожалуйста, как новичку. <<>>

Проблема: TypeScript защищает от потенциальных ошибок

Ошибка возникает потому, что TypeScript — это строго типизированный язык, который помогает избежать ошибок во время выполнения. В вашем случае inputElement.value имеет тип string | undefined, потому что TypeScript учитывает возможность, что элемент может не иметь атрибута value (например, если это <div> или элемент удалён из DOM). Даже если вы уверены, что элемент существует, TypeScript этого не знает и требует явной обработки.

Вот три основных способа решить проблему:

1. Оператор утверждения (Non-null assertion) — !

Если вы абсолютно уверены, что значение не может быть undefined, используйте оператор !:

const value = inputElement.value!; // string
const length = getLength(value); // OK

Минус: Если вы ошиблись, в рантайме будет ошибка. Используйте только когда уверены на 100%.

2. Проверка на undefined (Type guard)

Самый безопасный способ — проверить значение перед использованием:

const value = inputElement.value;
if (value !== undefined) {
  const length = getLength(value); // TypeScript знает, что здесь value — string
  console.log(length);
} else {
  console.log('Значение отсутствует');
}

Этот подход гарантирует, что код не упадёт, если вдруг значение undefined.

3. Значение по умолчанию (Default value)

Используйте оператор ?? (nullish coalescing), чтобы задать значение по умолчанию:

const value = inputElement.value ?? ''; // если undefined, то пустая строка
const length = getLength(value); // OK

Это удобно, когда вы хотите продолжить работу даже при отсутствии значения.

Рекомендация для новичков

Начните с проверки на undefined (вариант 2) — это самый надёжный способ. Со временем вы научитесь выбирать подходящий метод в зависимости от контекста.

Вот полный исправленный пример:

function getLength(text: string): number {
  return text.length;
}

const inputElement = document.getElementById('myInput') as HTMLInputElement;
const value = inputElement.value;

// Безопасная проверка
if (value !== undefined) {
  const length = getLength(value);
  console.log(length);
} else {
  console.log('Input не имеет значения');
}
<<>>

Альтернативный подход: использование строгой проверки и логического оператора

Если вы часто сталкиваетесь с такой ошибкой, можно создать вспомогательную функцию-утилиту для безопасного извлечения значений из DOM:

function getInputValue(id: string): string {
  const element = document.getElementById(id) as HTMLInputElement | null;
  if (!element) {
    throw new Error(`Элемент с id "${id}" не найден`);
  }
  return element.value ?? '';
}

// Использование
const value = getInputValue('myInput'); // всегда string
const length = getLength(value); // OK

Этот подход особенно полезен, когда вы работаете с несколькими элементами или хотите централизованно обрабатывать ошибки. Плюс: код становится чище, а типизация — строже. Минус: нужно писать больше boilerplate-кода.

Ещё один вариант — использовать TypeScript в режиме strict: false, но это не рекомендуется, так как вы теряете защиту от многих ошибок. Лучше привыкать к строгой типизации с самого начала.

Помните: ошибка string | undefined — это не баг, а фича TypeScript, которая делает ваш код надёжнее. Со временем вы научитесь использовать её в своих интересах.