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