Avatar ·

Как преобразовать строку в число в TypeScript: полное руководство

Всем привет! Я новичок в TypeScript и JavaScript, и у меня возникла проблема с преобразованием строки в число. У меня есть функция, которая принимает данные из формы. Пользователь вводит возраст в текстовое поле, и я получаю строку типа "25". Мне нужно преобразовать эту строку в число, чтобы выполнить математические операции, например, проверить, является ли возраст больше 18. Вот что я пробовал: ```typescript const ageInput: string = "25"; const age: number = ageInput; // Ошибка: Type 'string' is not assignable to type 'number' ``` Я понимаю, что TypeScript строго типизирован, и просто так присвоить строку числу нельзя. Но как правильно это сделать? Я читал про `parseInt`, `parseFloat` и `Number()`, но не понимаю, какой способ лучше и в каких случаях их использовать. Также слышал про оператор `+`, но он мне кажется странным. Ещё меня интересует, как обрабатывать случаи, когда строка не может быть преобразована в число (например, пользователь ввёл "abc"). Подскажите, пожалуйста, как правильно конвертировать строку в число в TypeScript, чтобы избежать ошибок и сделать код надёжным? Заранее спасибо! <<>>

Основные способы преобразования строки в число в TypeScript

В TypeScript (как и в JavaScript) есть несколько способов преобразовать строку в число. Выбор зависит от контекста и требуемой точности. Рассмотрим все основные методы с примерами.

1. Функция Number() — универсальный способ

const str: string = "42";
const num: number = Number(str);
console.log(num); // 42
console.log(typeof num); // "number"

Плюсы:

  • Простой и читаемый синтаксис
  • Работает с целыми и дробными числами
  • Возвращает NaN (Not a Number), если преобразование невозможно

Минусы:

  • При пустой строке возвращает 0 (может быть неочевидно)
  • Не отсекает пробелы — строка " 42 " преобразуется корректно

2. parseInt() — для целых чисел

const str: string = "42.7px";
const num: number = parseInt(str, 10);
console.log(num); // 42 (дробная часть отбрасывается, "px" игнорируется)

Важно: Второй аргумент (radix) — система счисления. Всегда указывайте 10 для десятичных чисел, иначе старые браузеры могут интерпретировать строку "08" как восьмеричное число.

Особенности:

  • Игнорирует нечисловые символы после первого числа
  • Полезен для парсинга CSS-значений ("100px", "2.5rem")
  • Если строка начинается с нечислового символа — вернёт NaN

3. parseFloat() — для чисел с плавающей точкой

const str: string = "3.14abc";
const num: number = parseFloat(str);
console.log(num); // 3.14

Работает аналогично parseInt, но сохраняет десятичную часть.

4. Унарный оператор + — краткий синтаксис

const str: string = "123";
const num: number = +str;
console.log(num); // 123

Этот способ эквивалентен Number(str), но короче. Однако может снижать читаемость кода для новичков.

5. Приведение через ~~ (побитовое НЕ) — для целых чисел

const str: string = "42.9";
const num: number = ~~str;
console.log(num); // 42 (отбрасывает дробную часть)

Работает только для 32-битных целых чисел (диапазон от -2^31 до 2^31-1). Используйте с осторожностью.

Обработка ошибок и валидация

Всегда проверяйте результат преобразования:

function safeParseNumber(value: string): number | null {
  const num = Number(value);
  // Проверка на NaN и пустую строку
  if (isNaN(num) || value.trim() === "") {
    return null;
  }
  return num;
}

// Использование:
const ageInput: string = "25";
const age = safeParseNumber(ageInput);
if (age !== null && age >= 18) {
  console.log("Доступ разрешён");
} else {
  console.log("Некорректный возраст");
}

Рекомендации по выбору метода

  • Для форм и пользовательского ввода: используйте Number() с проверкой через isNaN()
  • Для парсинга CSS или смешанных строк: parseInt() или parseFloat()
  • Для максимальной производительности: оператор + (но жертвуете читаемостью)
  • Всегда обрабатывайте случай NaN — это убережёт от логических ошибок

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

<<>>

Использование библиотеки validator для надёжной конвертации

Если вы работаете с большим количеством пользовательского ввода или API, рекомендую использовать библиотеку validator (или zod для более сложных схем). Это избавит вас от написания повторяющихся проверок.

// Установка: npm install validator
import validator from 'validator';

function parseNumberSafe(value: string): number | null {
  if (!validator.isNumeric(value)) {
    return null;
  }
  return Number(value);
}

// Пример с zod (рекомендую для форм):
import { z } from 'zod';

const ageSchema = z.string().transform(val => {
  const num = Number(val);
  if (isNaN(num)) throw new Error("Invalid number");
  return num;
});

const result = ageSchema.safeParse("25");
if (result.success) {
  console.log(result.data); // 25 (уже number)
}

Дополнительный совет: TypeScript-утилиты

Можно создать свой тип-гард для проверки:

function isNumberString(value: string): value is `${number}` {
  return !isNaN(Number(value)) && value.trim() !== "";
}

function processAge(input: string): void {
  if (isNumberString(input)) {
    const age: number = Number(input);
    console.log(`Возраст: ${age}`);
  } else {
    console.log("Некорректный ввод");
  }
}

Такой подход делает код самодокументируемым и понятным для других разработчиков.