Вариационные обобщенные функции типизации потока в JS - PullRequest
0 голосов
/ 08 апреля 2019

Когда я имею дело с библиотечным / сторонним кодом, я знаю, что довольно просто справиться с набором универсальных универсальных функций. Например, функция zipWith для lodash в flow-typed на Github здесь просто определяет несколько подписей для функции, указав ее несколько раз в блоке declare для этого модуля.

Однако я не смог определить / подтвердить / получить эту же функциональность, работая с кодом первой стороны, полностью содержащимся в репозитории - и существующие проблемы Github, кажется, предполагают, что это может быть невозможно (например, - https://github.com/facebook/flow/issues/1251 Support variadic generics), но я не уверен, что я неправильно истолковал, учитывая, что функциональность уже существует с сторонними библиотеками.

Я попытался создать libdefs, как описано в документации https://flow.org/en/docs/libdefs/, и объявить модули, которые на самом деле являются «локальными» для репо, без особой удачи.

Чтобы проиллюстрировать, чего я пытаюсь достичь, вот пример типов / использования:

// types
declare module 'with-retries' {
  declare export function retry<T0>(a0: T0): [Observable<T0>];
  declare export function retry<T0, T1>(a0: T0, a1: T1): [Observable<T0>, Observable<T1>];
  declare export function retry<T0, T1, T2>(a0: T0, a1: T1, a2: T2): [Observable<T0>, Observable<T1>, Observable<T2>];
  // etc...
}

// usage in with-retries.js
export retry = (...observables) => observables.map(o => o.retry(5));

Вещи, которые я пытался без удачи:

  • использование абсолютных путей с использованием процесса добавления типов в сторонние библиотеки на основе официальных документов, но вместо этого для внутренних модулей
  • «перегрузка» функции с несколькими указанными аргументами (естественно, это не работает, поскольку поток будет жаловаться на определение, уже существующее для данной функции)

Возможно ли это сделать? Заранее спасибо.

...