Nano Hash - криптовалюты, майнинг, программирование

Как исправить определение типов редукторов? (ТС2345)

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

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];
};

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

31.03.2019

Ответы:


1

Ошибка при применении редьюсера возникает из-за того, что после .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)[][], который представляет собой массив массивов без каких-либо нулей, что, надеюсь, будет работать.

01.04.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..