Для типизации аргументов функции в зависимости от другого аргумента в 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. Выбор между этими подходами зависит от конкретной ситуации и предпочтений разработчика.