Как исправить определение типов редуктора? (TS2345) - PullRequest
1 голос
/ 31 марта 2019

У меня есть функция, которая пересекает массив и находит наиболее вероятные пары идентификаторов и счетчиков различных символов. Неверные значения возвращаются как нуль, и после отображения функции я фильтрую все эти нули.

export const findLikelyPairsId = (testingId: string, testingIdIdx: number, allIds: string[]) => {
  const result = allIds
    .map((comparingId: string, comparingIdIdx: number) => {
      if (comparingIdIdx === testingIdIdx) return null;

      const difference: number = differedLetters(testingId, comparingId);
      const approvedDiffer: boolean = difference <= testingId.length - 1;
      return approvedDiffer ? [testingId, comparingId, difference] : null;
    })
    .filter(value => value !== null);

  return [...result];
};

Все еще машинопись кричит мне на мою функцию редуктора, что

Argument of type '(acc: any[], value: any[]) => any[]' is not assignable to parameter of type '(previousValue: any[], currentValue: (string | number)[] | null, currentIndex: number, array: ((string | number)[] | null)[]) => any[]'.

Types of parameters 'value' and 'currentValue' are incompatible.

Type '(string | number)[] | null' is not assignable to type 'any[]'.

Type 'null' is not assignable to type 'any[]'.
export const likelyListReducer = (acc: any[], value: any[]): any[] => {
  return acc[2] ? (acc[2] > value[2] ? [...value] : [...acc]) : [...value];
};

Что я делаю не так?

1 Ответ

1 голос
/ 01 апреля 2019

Ошибка при применении редуктора происходит из-за того, что тип массива не меняется после .filter(value => value !== null);. TypeScript по-прежнему предполагает, что массив может содержать null, а функция-редуктор ожидает value: any[] в качестве второго аргумента, поэтому он не принимает null значение элемента массива.

Есть способ сообщить компилятору , что filter должен изменить тип массива: вы должны использовать предикат типа в качестве обратного вызова фильтра, как объяснено в этом ответе. Вам нужно где-то определить функцию предиката этого типа

function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
    return value !== null && value !== undefined;
}

и используйте его в filter() так:

.filter(notEmpty);

с этим изменением тип возвращаемого значения findLikelyPairsId выводится как (string | number)[][], который представляет собой массив массивов без каких-либо нулей, который, как мы надеемся, будет работать.

...