Как правильно типизировать return функции в зависимости от переданных параметров?

В TypeScript есть несколько способов типизировать возвращаемое значение функции в зависимости от переданных параметров. Рассмотрим несколько вариантов.

1. Использование условных типов:
Для типизации возвращаемого значения в зависимости от переданных параметров можно использовать условные типы в TypeScript. Например:

function getValue<T>(value: T): T extends string ? string : number {
  if (typeof value === 'string') {
    return value.toUpperCase();
  } else {
    return value * 2;
  }
}

В данном примере, если переданный параметр является строкой, возвращается строка (приведенная к верхнему регистру), иначе возвращается число умноженное на 2. Это означает, что возвращаемый тип функции будет зависеть от типа переданного параметра.

2. Использование перегрузок:
Другой способ типизации возвращаемого значения функции в зависимости от переданных параметров - это использование перегрузок. Например:

function getValue(value: string): string;
function getValue(value: number): number;
function getValue(value: string | number): string | number {
  if (typeof value === 'string') {
    return value.toUpperCase();
  } else {
    return value * 2;
  }
}

В данном примере мы определяем две перегрузки функции: одну для строковых параметров и другую для числовых параметров. Затем, реализуем саму функцию, которая проверяет тип переданного параметра и возвращает соответствующий тип. При вызове функции, TypeScript выберет соответствующую перегрузку в зависимости от переданного параметра.

3. Использование типовых словарей:
Также можно воспользоваться типовыми словарями для типизации возвращаемого значения функции. Например:

type ValueMapper = {
  string: string;
  number: number;
};

function getValue<T extends keyof ValueMapper>(value: T): ValueMapper[T] {
  if (typeof value === 'string') {
    return value.toUpperCase() as ValueMapper[T];
  } else {
    return value * 2 as ValueMapper[T];
  }
}

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

Все эти методы позволяют типизировать возвращаемое значение функции в зависимости от переданных параметров в TypeScript. В зависимости от конкретной ситуации и предпочтений разработчика можно выбрать наиболее удобный и подходящий способ.