Перегрузка функций в TypeScript с разными типами результата

Перегрузка функций в TypeScript с разными типами результата
Содержание статьи

Если функция принимает строку и массив строк, перегрузки позволяют дать каждому вызову точный тип результата. В примере Mentoring.digital функция убирает пробелы по краям. Для строки она возвращает строку, для массива возвращает массив.

Объявления вызовов и общая реализация

Сначала перечислите доступные сигнатуры, затем напишите одну реализацию. Её параметры и результат должны быть совместимы с объявленными вариантами. Сигнатура реализации нужна для проверки тела функции. Доступные вызовы определяются объявлениями перегрузок выше.

function trimValue(value: string): string;
function trimValue(value: string[]): string[];

function trimValue(
  value: string | string[]
): string | string[] {
  return typeof value === "string"
    ? value.trim()
    : value.map(item => item.trim());
}

const text = trimValue("  a  ");
const items = trimValue([" a ", " b "]);

Что происходит с аргументом union

Для text TypeScript выводит string, для items выводит string[]. Если переменная сама имеет тип string | string[], ни одна из двух сигнатур не принимает её целиком. Сузьте тип до вызова или добавьте отдельную доступную сигнатуру с объединением аргументов и результатов.

Когда перегрузки оправданы

Если результат одинаков для всех входов, часто достаточно одного параметра с объединением типов. Сигнатуры полезны, когда нужно выразить зависимость результата от входа или разные наборы аргументов. Проверьте оба корректных вызова и недопустимый тип, например число. В таком примере TypeScript должен отклонить вызов с числом до запуска программы.

Подобные интерфейсы удобно разбирать на курсе фронтенда с практикой TypeScript. Для API со многими вариантами входа можно сравнить перегрузки и другие варианты типизации вместе с наставником по TypeScript.

Похожие статьи по данной теме