Описать тип , возвращающий тип 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 шт):

Автор решения: sailybra

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];
→ Ссылка