Lodash _.reduce () Ошибка «Ожидается 2-3 аргумента, но получено 2» в TypeScript - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь уменьшить коллекцию ListAdItemResponse[] до {[name: string]: Date}, введите один из моих тестов и убедитесь, что каждая последующая опубликованная дата предшествует текущей (например, отсортирована по publishedAt в порядке убывания):

 _.reduce<ListAdItemResponse, {[name: string]: Date}>(
   data,
   (result, val) => {
     expect(new Date(val.publishedAt)).to.be.beforeTime(
       new Date(result.publishedAt),
      )
     return {publishedAt: val.publishedAt}
   })

Используя TypeScript 2.9.2, я получаю эту странную противоречивую ошибку («Ожидается 2-3 аргумента, но получено 2»). Согласно документации Lodash, третий аргумент является необязательным, но я не могу обойти эту ошибку, что бы я ни пытался. Есть идеи, что тут может быть не так? Спасибо.

P.S. Компилируется без ошибок, но, очевидно, нарушает мой тест:

_.reduce<ListAdItemResponse, {[name: string]: Date}>(
  data,
  (result, val) => {
    expect(new Date(val.publishedAt)).to.be.beforeTime(
      new Date(result.publishedAt),
    )
    return {publishedAt: val.publishedAt}
  }, {}) // with {} added as 3rd argument

Обновление 9/2/18:

По предложению Мэтта, я попробовал этот подход, но на этот раз получил 3 ошибки компиляции. Похоже, он ожидает, что alis.data тип коллекции будет {[name: string]: Date} вместо ListAdItemResponse[], как сейчас:

_.reduce<{[name: string]: Date}>(
  alis.data, // <-- error 1: Argument of type 'ListAdItemResponse[]' is not assignable to parameter of type '{ [name: string]: Date; } | null | undefined'.Type 'ListAdItemResponse[]' is not assignable to type '{ [name: string]: Date; }'. Index signature is missing in type 'ListAdItemResponse[]'.
  (result, val) => { // <-- errors 2,3: Parameter 'result' implicitly has an 'any' type. Parameter 'val' implicitly has an 'any' type.
    expect(new Date(val.publishedAt)).to.be.beforeTime(
      new Date(result.publishedAt),
    )
    return {publishedAt: val.publishedAt}
  })

1 Ответ

0 голосов
/ 01 сентября 2018

Если вы хотите опустить третий аргумент, тогда тип входных элементов и аккумулятора должен быть одинаковым, поэтому ожидается, что вы передадите только один аргумент типа:

_.reduce<{[name: string]: Date}>(...)

Я подал проблему за противоречивое сообщение об ошибке.

Раунд 2

Несмотря на то, что количество ошибок увеличилось, вы ближе к цели! Предполагая, что определение ListAdItemResponse выглядит примерно так:

interface ListAdItemResponse {
    publishedAt: Date;
    // other fields...
}

тогда ваш вызов _.reduce не соответствует намеренной вами перегрузке, поскольку ListAdItemResponse нельзя назначить {[name: string]: Date}, поскольку он не имеет подписи индекса. (Заблуждение, что ошибка TypeScript # 1 основана на неверном допущении, что вам нужна другая перегрузка, предназначенная для уменьшения избыточности ключей объекта.) Существует специальное исключение для литеральных типов объектов, таких как тот, который вы возвращаете из редуктора. Вероятно, вам следует изменить тип состояния на {publishedAt: Date}, потому что это единственное поле, которое вы используете:

_.reduce<{publishedAt: Date}>(...)

Это должно привести к тому, что ошибки # 2 и # 3 также исчезнут.

...