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

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

## Перегрузка функции

Перегрузка функции позволяет объявить несколько версий функции с разными сигнатурами. В каждой версии функции можно указать различные типы аргументов в зависимости от требований. Например, если тип аргумента 'foo' равен 'bar', то тип аргумента 'baz' будет 'number', а если тип аргумента 'foo' равен 'qux', то тип аргумента 'baz' будет 'string'.

function myFunction(foo: 'bar', baz: number): void;
function myFunction(foo: 'qux', baz: string): void;
function myFunction(foo: 'bar' | 'qux', baz: number | string): void {
  // Реализация функции
}

В данном примере мы объявили две версии функции myFunction, одна с аргументами 'bar' и number, другая с аргументами 'qux' и string. Реализация самой функции myFunction находится в третьей строке.

## Условные типы

Еще один способ типизировать аргументы функции в зависимости от другого аргумента - использовать условные типы. Условные типы позволяют делать выбор между двумя типами в зависимости от условия. Например, если тип аргумента foo равен 'bar', то тип аргумента baz будет 'number', а если тип аргумента foo равен 'qux', то тип аргумента baz будет 'string'.

type MyFunction<T extends 'bar' | 'qux'> = T extends 'bar' ? (baz: number) => void : (baz: string) => void;

const myFunction: MyFunction<'bar' | 'qux'> = (baz) => {
  // Реализация функции
};

В данном примере мы определяем условный тип MyFunction, который принимает обобщенный тип T, равный либо 'bar', либо 'qux'. Если тип T равен 'bar', то функция принимает аргумент типа number, иначе функция принимает аргумент типа string. Затем мы определяем константу myFunction и присваиваем ей соответствующую версию функции в зависимости от типа T.

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