Описать тип , возвращающий тип N-нного аргумента функции Fn
FN - Generic-аргумент, принимающий только функции.
N - Generic-аргумент, принимающий только числа. Показывает индекс аргумента, тип которого необходимо получить.
Тесты:
const numberParam: FunctionParameter<(arg: number) => void, 0> = 100
const stringParam: FunctionParameter<(arg1: string, arg2: string) => void, 1> = 'Hello world!'
const undefinedParam: FunctionParameter<(arg1: string, arg2: boolean) => void, 9312> = undefined
Решил так, решение работает, но ругается.
type FunctionParameter<Fn extends (...args:any) => any, N> =
Fn extends (...args:infer P) => any? P[N] : never
Есть ли способы получше?
Ответы (1 шт):
TS ругается потому что N может быть любым типом, в том числе таким, по которому аргументы не индексируются. Решение - ограничить N ключами массива аргументов. Так же в TS уже есть встроенный тип Parameters<F> для получения типов аргументов, буду использовать его для простоты понимания.
Поскольку мы знаем, что список аргументов всегда является массивом, мы можем просто ограничить N типом number:
type NthParameter<F extends (...args: any[]) => any, N extends number> = Parameters<F>[N];
Либо можно напрямую ограничить его ключами используемого объекта:
type NthParameter<F extends (...args: any[]) => any, N extends keyof Parameters<F>> = Parameters<F>[N];