Я написал такую функцию:
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;
})();
Как правильно это сделать?