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

Я пытаюсь написать проект 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 в том виде, в каком он используется. Итак, я полагаю, что для этого есть синтаксис потока, я просто не мог понять, что это было, и не мог найти его в документации.


person Richard Rast    schedule 24.12.2017    source источник


Ответы (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);
person user3707125    schedule 25.12.2017
comment
Я не уверен, почему этот ответ привлекает так много голосов. Это не работает. Безымянная статическая функция не распознается потоком и вызывает ошибку потока. - person Richard Rast; 05.01.2018
comment
Не могли бы вы рассказать об ошибке? Этот код не терпит неудач для меня в Flow / Try, также это то, что мы используем в нашей базе кода для таких ситуации. - person user3707125; 06.01.2018