Что такое Тип параметров? Это служебный тип в TypeScript, который позволяет нам принимать аргументы функции и превращать их в новый тип.

Тип TypeScript Parameters используется для получения параметров или аргументов функции и создания на их основе нового типа. Это весьма полезно, когда мы знаем, что ввод Function соответствует определенному типу, и мы хотим воспроизвести это. В этом руководстве мы рассмотрим, как работает тип утилиты Parameters.

Пользовательские типы TypeScript

В этом руководстве рассматриваются пользовательские типы. Если вы новичок в пользовательских типах, прочитайте мое руководство по пользовательским типам здесь.

Как работает тип параметров

Представьте, что у вас есть функция с заданным количеством аргументов. Например, вот функция TypeScript с двумя параметрами или аргументами, a и b:

const myFunction = (a: string, b: string) => {
    return a + b;
}

Допустим, мы хотим запустить эту функцию. Один из способов — передать массиву типа кортеж оператор три точки. Например:

const myFunction = (a: string, b: string) => {
    return a + b;
}
let passArray:[string, string] = [ 'hello ', 'world' ]
// Returns 'hello world'
myFunction(...passArray);

Здесь мы определяем кортеж, который представляет собой просто [string, string], который мы можем передать в myFunction, удовлетворяя оба аргумента a и b.

Это прекрасно работает, но что, если аргументы myFunction изменятся? Это особенно вероятно, если myFunction исходит от стороннего скрипта. Тогда нам нужно будет не только обновить нашу функцию, но и не забыть обновить тип кортежа, который мы передаем. Нам также нужно будет оставаться в курсе пакета myFunction на случай, если он изменится.

Вместо этого, если мы хотим, чтобы они всегда совпадали, мы можем использовать Parameters для создания одного и того же типа. Это создаст тип аргументов кортежа, вместо того, чтобы определять его вручную:

type myType = Parameters<typeof myFunction>
// Equivalent to a tuple type of:
// type myType = [ a: string, b: string ]

Это избавляет нас от некоторых хлопот при определении пользовательских типов, поскольку теперь мы можем передать любой тип myType в myFunction, не опасаясь ошибки:

const myFunction = (a: string, b: string) => {
    return a + b;
}
type myType = Parameters<typeof myFunction>
let myArray:myType = [ 'hello ', 'world' ];
myFunction(...myArray)

Ввод определенных параметров с помощью типа Parameter Utility

Типы параметров также достаточно гибки и позволяют нам определять больше, чем просто полный набор аргументов. Например, если мы хотим сопоставить только тип первого аргумента в нашей функции myFunction, мы можем сослаться на него как на простой массив, добавив [0]. Следующее будет соответствовать типу a, но если мы хотим соответствовать типу b, мы можем использовать [1]:

type myType = Parameters<typeof myFunction>[0]
// Equivalent of 'string'

Таким образом, мы могли бы определить пользовательские типы для каждого аргумента, если это необходимо в нашем коде. Например, здесь мы определяем два пользовательских типа для первого и второго параметров функции и передаем их оба в нашу функцию:

const myFunction = (a: string, b: string) => {
    return a + b;
}
type aType = Parameters<typeof myFunction>[0]
type bType = Parameters<typeof myFunction>[1]
let a:aType = 'hello '
let b:bType = 'world'
myFunction(a, b)

Больше удовольствия с параметрами

Поскольку Parameters преобразует тип аргументов в новый тип, мы также можем передать функцию прямо в него. Ниже будет создан тип [ a: string, b: number ]. Это менее полезно, чем получение параметров из конкретной функции, но в определенных ситуациях может пригодиться:

type anotherType = Parameters<(a: string, b: number) => void>

Это для этой темы. Спасибо за чтение.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.