Создать тип для частичной функции - PullRequest
0 голосов
/ 20 мая 2018

У меня есть функция с объявленным типом.Я планирую использовать частичную версию этой функции.Но мне нужно сначала объявить переменную для частичной версии.

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

Вот как я хочу его использовать:

function myFunc(a: number, b: number): number {
    return a + b
}

let partFunc: PartialFunc<typeof myFunc>

// later
partFunc = (b) => myFunc(42, b)

И я не знаю, возможно ли создать PartialFunc<Func> универсальный.

Я пробовал этот подход

interface Func1<T1, TRes> {
    (a: T1): TRes
}
interface Func2<T1, T2, TRes> {
    (a: T1, b: T2): TRes
}
interface PartialFunc<TFunc extends Func2<T1, T2, TRes>, T1=any, T2=any, TRes=any> extends Func1<T2, TRes>{}

или то же самое с универсальными типами:

type F1<T1, TRes> = (a: T1) => TRes
type F2<T1, T2, TRes> = (a: T1, b: T2) => TRes
type PF<Func extends F2<T1, T2, TRes>, T1=any, T2=any, TRes=any> = F1<T2, TRes>

Но для этого все равно требуется указать все типы:

let partFunc: PF<typeof myFunc, number, number, number>

В противном случае у меня есть any типы.

Несмотря на то, что это принудительно проверяет тип, например, он не принимает PF<typeof myFunc, number, number, string>, я бы хотел избежать повторного ввода типов.

В основном я хочу сказать TS Принять подписьэтой функции и удалите первый параметр

Есть ли какое-либо решение для этого?

Контекст этой задачи - у меня есть приложение react-redux, и я хочу связать параметр сХранить в действии диспетчер.

1 Ответ

0 голосов
/ 20 мая 2018

В TypeScript 2.8 и выше вы можете использовать условные типы , чтобы сделать это, используя удивительный вывод типа в условных типах .Вот как вы можете использовать его в данной конкретной ситуации:

type RemoveFirstParamFromTwoParamFunction<F extends (a: any, b: any)=>any> =
  F extends (a: any, b: infer B) => infer R ? (b: B) => R : never

function myFunc(a: number, b: number): number {
    return a + b
}

let partFunc: RemoveFirstParamFromTwoParamFunction<typeof myFunc>;
partFunc = (b) => myFunc(42, b);

Обратите внимание, как это работает только с конкретными функциями ровно двух обязательных параметров.Если вам нужно, чтобы он работал над возможными общими функциями с большим / меньшим количеством необязательных параметров, вам придется работать усерднее, чтобы выполнить это, перечислив случаи и тщательно протестировав.Это потому, что в настоящее время в TypeScript (начиная с TypeScript 2.8) отсутствует способ программного доступа к параметрам функции .Точный тип RemoveFirstParam<>, который вам нужен, зависит от вашего варианта использования.

Надеюсь, это поможет.Удачи.

...