Ввод функции трубы в js с типом потока - PullRequest
1 голос
/ 14 февраля 2020

Итак, у меня есть следующая функция канала в js, которую я набрал с помощью flow:

const pipe = (...fns: $ReadOnlyArray<any>): any => (param: any) => fns.reduce((result, fn) => fn(result), param)

, и я надеялся разрешить некоторую печать и использовать mixed введите, например, так:

const pipe = (...fns: $ReadOnlyArray<mixed>): mixed => (param: mixed) => fns.reduce((result, fn) => fn(result), param)

Но поток выдает сообщение об ошибке:

поток: вывести ошибку - fn (Невозможно вызвать 'fn', так как смешанный [1] не является функция)

См онлайн здесь:. https://flow.org/try/#0PTAEAEDMBsHsHcBQBjWA7AzgF1ABwJa4CmoAvKABQB0NkmAXKACQBKRAhgCYDya0AngEEATsPb8APOzT8AfAEpG0 -mVmVc7MQFslM + atB0MVYUU4BXZEQoVTGc9CwAaQ2n2k1dW0XuP5LjW15RBR0bDxCIgAmMkoaKiNGVg4ePiFRcQktfAAPMwVGbLzOAwpA9h1QIrN3T0wTM0trb19nV1rXFocsfzxNCvkgA

1020 * Это не конец света, если я должен использовать * Типа 1021 *, но мне было интересно, почему я не могу использовать тип mixed? Я имею в виду, что разрешено принимать функцию в соответствии с документами: https://flow.org/en/docs/types/mixed/

1 Ответ

1 голос
/ 14 февраля 2020

Как определено, эта функция принимает любое количество аргументов, которые могут быть чем угодно. Да, это включает в себя функции, но также включает, например, числа. Что произойдет, если вы позвоните pipe(5)?

Вместо этого, похоже, что вы хотите ограничить его только функциями. Это просто сделать - просто замените $ReadOnlyArray<mixed> на ReadOnlyArray<mixed => mixed>. С этим изменением проверяется тип функции.

Однако, это все еще не очень полезный тип. Будет неприятно использовать результат, так как это mixed. Это означает, что Flow ничего не знает о его типе, поэтому вам придется уточнить его перед использованием. И, уточнения во время выполнения могут только go.

Эта функция была бы намного более полезной, если бы она была полиморфной c:

const pipe = <T>(...fns: $ReadOnlyArray<T => T>): (T => T) => {
  return (param) => {
    return fns.reduce((result, fn) => fn(result), param);
  };
}

function plus5(x) { return x + 5; }
function times3(x) { return x * 3; }
const plus5times3 = pipe(plus5, times3);

(plus5times3(6): number);
// expected error
(plus5times3(6): string);

( детская площадка )

Теперь вы можете позвонить и получить полезный результат. Как написано, вы можете иногда получать ошибочные ошибки типа из-за логического вывода типа, но это обычно решается добавлением дополнительных аннотаций типов. В частности, я рекомендую добавить аннотацию типа к результату compose, например

const plus5times3: number => number = pipe(plus5, times3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...