Поток как вывести для рекурсивного типа функции? - PullRequest
0 голосов
/ 29 октября 2018

Я написал такую ​​функцию:

const andThen = it => then => then === undefined ? it : andThen(it/* == null ? it : */ && then(it));

И надеюсь, что он работает как нулевой сахар другого языка, такого как ?.let kotlin:

o?.let { fn(it.a) }.?let { gn(it.b) }?.let { hn(it.c) }

Однако, если я использую эту функцию, я не смогу получить дружественные подсказки типа IDE:

const r = andThen(1)(it => it + 1)(it => it * 2)(); // expected `number`, but got `any`.

Итак, я хочу добавить определение flow для него следующим образом:

// try to typed `andThen`:
type AndThen<It> = (thenFn?: <Then>(it: It) => Then) => It | AndThen<Then>/* AndThen<Then, any> //how to define that? */;

Но это не работает, так как flow, похоже, не смог определить тип рекурсивной функции.

const ok = (() => {
    const fn = (it: 1): AndThen<1> => thenFn => thenFn === undefined ? it : andThen(it && thenFn(it));
    const r = fn(1);
    const rr = r(() => 2); // expected: `1 | AndThen<2>`, got `any`.
    // const rrParam = (_it: 1) => 2; const rr = r(rrParam); // not work too.
    return rr() === 2;
})();

Как правильно это сделать?

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