Можно ли набрать метод "spreadCall"? головоломка с условным типом и выводом - PullRequest
0 голосов
/ 09 января 2019

У меня есть проблема на работе, которую я могу суммировать с этим примером: возможно ли полностью ввести следующую функцию?


    function spreadCall(f1, f2) {
        const args = f1();
        f2(...args);
    }

Таким образом, нам нужно, чтобы f2 принимал ровно столько же аргументов (т. Е. Кортеж) с типами в том же порядке, что и результат f1. Я не могу найти способ сделать это - частичное решение, которое я могу придумать, это перечислить несколько чисел аргументов, то есть


    type Output<F> = 
         F extends ()=>[infer A0] ? (a0:A0)=>void :
         F extends ()=>[infer A0, infer A1] ? (a0:A0, a1:A1)=>void :
         F extends ()=>[infer A0, infer A1, infer A2] ? (a0:A0, a1:A1, a2:A2)=>void :
         never;
    // enumerate as many number of arguments as desired ^^

    function spreadCall<InputF>(f1:InputF, f2:Output<InputF>) {
        // ...
    }

Есть ли способ сделать это, который обрабатывает любое количество аргументов?

1 Ответ

0 голосов
/ 09 января 2019

Я думаю, вы можете использовать универсальный тип параметра отдыха , чтобы делать то, что вы хотите:

function spreadCall<A extends any[]>(f1: () => A, f2: (...args: A) => any) {
    const args = f1();
    f2(...args);
}

Возвращением f1 должен быть кортеж , который соответствует типам параметров функции f2:

declare function input(): [number, string]
declare function output(a: number, b: string): void;

spreadCall(input, output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...