FLOW: как заставить Flow работать с обратным вызовом для Array.prototype.find () - PullRequest
0 голосов
/ 27 октября 2018

Ребята, я новичок в Flow.

У меня есть этот код

type importItem = {
  name: string,
  groupRank: number,
  rank: number,
  node: Object,
};
function findTargetImportItem(importedItems: Array<importItem>, outOfOrderItem: importItem) : importItem {

return importedItems.find((importedItem: importItem) => importedItem.rank > outOfOrderItem.rank);}

Я получил эту ошибку

Cannot return importedItems.find(...) because undefined [1] is incompatible with importItem [2].

     src/rules/import-order.js
 [2]  74│ function findTargetImportItem(importedItems: Array<importItem>, outOfOrderItem: importItem) : importItem {
      75│   /**
      76│      * Return the import where the unordered imports will be moving towards
      77│      */
      78│   return importedItems.find((importedItem: importItem) => importedItem.rank > outOfOrderItem.rank);
      79│ }
      80│
      81│ function hasTrailingSpace(sourceCode, node) {

     /private/tmp/flow/flowlib_21840530/core.js
 [1] 244│     find(callbackfn: (value: T, index: number, array: Array<T>) => any, thisArg?: any): T | void;

Я не знаю, как заставить Flow узнать, что материал, возвращаемый вспомогательной функцией find, является типом importItem.

Можете ли вы, ребята, помочь мне с этим

1 Ответ

0 голосов
/ 27 октября 2018

Компилятор потока корректен. Он знает, что значение, возвращаемое find() , может быть undefined.

Если ни один из элементов в массиве не удовлетворяет условию в обратном вызове, который вы передали, возвращаемое значение будет undefined. Либо измените тип возврата для findTargetImportItem() на void | importItem, либо присвойте возвращаемое значение find() временной переменной и верните некоторое значение по умолчанию типа importItem, если временная переменная undefined.

Решение 1

function findTargetImportItem(importedItems: Array<importItem>, outOfOrderItem: importItem) : void | importItem {
  /**
    * Return the import where the unordered imports will be moving towards
    */
  return importedItems.find((importedItem: importItem) => importedItem.rank > outOfOrderItem.rank);
}

Решение 2

const defaultImportItem: importItem = ...;

function findTargetImportItem(importedItems: Array<importItem>, outOfOrderItem: importItem) : importItem {
  /**
    * Return the import where the unordered imports will be moving towards
    */
  const importedItem = importedItems.find((importedItem: importItem) => importedItem.rank > outOfOrderItem.rank);

  return importedItem === undefined
    ? defaultImportItem
    : importedItem;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...