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