Как объявить типы потоков для функции с полями?

Я пытаюсь написать проект Javascript со строгой настройкой потока во всем мире. У меня также есть зависимость от big-integer. Нет никаких предустановленных аннотаций потока в flow-typed, к сожалению, и Google не предлагает ничего полезного в этой теме.

Как и многие пакеты JavaScript, big-integer экспортирует одну функцию, которая обычно называется bigInt. Это можно вызвать напрямую, например: bigInt(13), bigInt("134e134") и т.д., Который создает объекты, которые являются большими целыми числами (я решил назвать тип возвращаемого значения этой функции "классом" под названием "BigInteger" "основываясь на документации, но я не думаю, что внутренности действительно используют классы, поскольку я считаю, что пакет вышел до ES6).

Это отлично работает для вывода функции, и я могу прикрепить методы к этому классу, и мы все хороши. Однако bigInt сам имеет некоторые методы, например. bigInt.lcm(123, 234). Как я могу документировать это?

declare module "big-integer-types" {
  declare class BigInteger {
    add(addend: BigIntInput): BigInteger;
    minus(subtractand: BigIntInput): BigInteger;
    /* snip */
  }
  declare type BigIntInput = number | string | BigInteger;
  declare type BigIntFn = (void | number | string | BigInteger) => BigInteger;
}

declare module "big-integer" {
  import type { BigIntFn } from "big-integer-types";
  declare export default BigIntFn
}

Это хорошо работает для полей больших целых чисел, например. для проверки типов bigInt(12).plus("144e53"). Это здорово. Но это не включает bigInt.lcm(134, 1551), и это дает ошибку потока.

Альтернативой является объявление экспорта модуля big-integer типа, который имеет определенные связанные функции. Например:

declare module "big-integer-types" {
  declare type BigIntegerStaticMethods {
    lcm(a: BigIntInput, b: BigIntInput): BigInteger,
    /* snip */
  }

  declare type BigIntInput = number | string | BigInteger;
}

declare module "big-integer" {
  import type BigIntegerStaticMethods from "big-integer-types";
  declare export default BigIntegerStaticMethods
}

Это работает для статических методов, но я не знаю, как сказать, что может быть вызван "тип". Поэтому я не понимаю, как достичь обоих одновременно.

Это кажется странным, потому что функция с полями довольно распространена в javascript, и документация по потоку предполагает, что они потратили много усилий на то, чтобы система типа поддерживала javascript по мере ее использования. Поэтому я считаю, что для достижения этого есть синтаксис потока, я просто не мог понять, что это было, и не смог найти его в документах.

Ответ 1

Вы можете объявить неназванную статическую функцию в классе:

declare type BigIntInput = number | string | BigInteger;
declare class BigInteger {
  add(addend: BigIntInput): BigInteger;
  minus(subtractand: BigIntInput): BigInteger;

  static lcm(a: BigIntInput, b: BigIntInput): BigInteger;
  static (data?: BigIntInput): BigInteger;  
} 

BigInteger.lcm(1,2);
BigInteger(4).add(5);