Завдання

Реалізуйте вбудований тип Parameters<T>, не використовуючи його.

Розв’язок

В цьому завданні нам потрібно отримати частину інформації з функції. А точніше, параметри функції. Давайте почнемо з типу, який приймає загальний тип T, який ми будемо використовувати для отримання параметрів:

type MyParameters<T> = any;

Тепер, як ми можемо “отримати тип, про який ми ще не знаємо”? За допомогою виведення! Але перш ніж використовувати його, давайте почнемо з простого умовного типу, який перевіряє чи це функція:

type MyParameters<T> = T extends (...args: any[]) => any ? never : never;

Тут ми перевіряємо, чи відповідає тип T функції з будь-якими аргументами та будь-яким типом повернення. Тепер ми можемо замінити any[] у нашому списку параметрів на виведення:

type MyParameters<T> = T extends (...args: infer P) => any ? never : never;

Таким чином, компілятор TypeScript виводить список параметрів функції в тип P. Залишилося його повернути:

type MyParameters<T> = T extends (...args: infer P) => any ? P : never;

Посилання