Серия «Typescript» — Тип утилиты Parameters

Я хотел бы начать с того, что делаю эту серию, чтобы лучше изучить и понять Typescript, поэтому не стесняйтесь поправлять меня или обращаться ко мне.

Parameters

Конструирует кортеж типов из типов, используемых в параметрах функции типа Type.

Примеры:

type T0 = Parameters<() => string> // []
type T1 = Parameters<(s: string) => void> // [s: string]
type T2 = Parameters<<T>(arg: T) => T> // [arg: unknown]
Войти в полноэкранный режим Выйти из полноэкранного режима

Это означает, что наш тип должен выглядеть примерно так

const foo = (arg1: string, arg2: number): void => {}
const bar = (arg1: boolean, arg2: { a: 'A' }): void => {}
const baz = (): void => {}

MyParameters<typeof foo> // [string, number]
MyParameters<typeof bar> // [boolean, { a: 'A' }]
MyParameters<typeof baz> // []
Войти в полноэкранный режим Выйти из полноэкранного режима

Итак, что мы знаем на данный момент:

  • Получает функцию
  • Определяет типы переданных параметров функции
  • Возвращает кортеж типов параметров функции, если таковые имеются (без каламбура), или ничего
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer R ) => unknown ? R : never
Войти в полноэкранный режим Выйти из полноэкранного режима

Давайте разберем это на части:

T extends (...args: any[]) => any Можно прочитать это как то, что наш тип расширяет функцию и может вернуть что угодно или ничего.

Понимание ключевого слова infer
Ключевое слово infer можно использовать в условии в условном типе, чтобы поместить выведенный тип в переменную. Затем эта переменная может быть использована внутри условных ветвей.

T extends (...args: infer R ) => unknown ? R : never Итак, мы определяем типы параметров функции. Если она что-то возвращает, то есть были параметры, мы возвращаем вычисленный тип, иначе мы возвращаем never (ничего, игнорируется TS).

Спасибо!

Вы можете найти меня здесь Мой Твиттер

Оцените статью
devanswers.ru
Добавить комментарий