Тип не имеет сигнатур вызовов, почему так сложно фильтровать объект в TypeScipt?

#typescript

Вопрос:

Имеют следующие типы:

 export type BuyTicketData = {
  invoiceItems?: InvoiceItems;
};

export type InvoiceItems = {
  [invoiceItemId: string]: InvoiceItemData;
};
 

Я пытаюсь фильтровать здесь:

 const invoiceItems =  props.buyTicketData?.invoiceItems?.filter(
    ([key, value]: [key: any, value: any]) =>
      value.max == undefined || value.defaultValue === undefined || value.defaultValue == 1,
  )
 

но появляется ошибка:

 ./components/product/InvoiceItemsToDeliver.tsx:12:60
Type error: This expression is not callable.
  Type 'InvoiceItemData' has no call signatures.

  10 | const InvoiceItemsToDeliver = (props: ProductProps) => {
  11 | 
> 12 |   const invoiceItems =  props.buyTicketData?.invoiceItems?.filter(
     |                                                            ^
  13 |       ([key, value]: [key: any, value: any]) =>
  14 |         value.max == undefined || value.defaultValue === undefined || value.defaultValue == 1,
  15 |     )
 

Что случилось? Должен ли я использовать плоскую карту?

Комментарии:

1. Вы ожидаете, что элементы InvoiceItems на самом деле будут массивом ? Потому что это не то, что говорят ваши определения. И мы на самом деле не можем видеть, что такое InvoiceItemData, но, очевидно, это невозможно вызвать — почему вы ожидали иного?

2. ноно, это «объект», он содержит ключевое значение: [key, value]

3. Хорошо, так почему именно вы думаете, что у него есть метод фильтрации? Предполагается ли, что InvoiceItemData, к которому это относится, может быть вызвана? Если нет, то почему вы его вызываете ? И если это так, то, похоже, тип (который, опять же, вы не включили) неверен.

Ответ №1:

filter и flatMap применитесь к массивам. Ваше InvoiceItems — это объект.

 export type InvoiceItems = {
  [invoiceItemId: string]: InvoiceItemData;
};
 

Даже если вы будете повторять его с for ... in помощью или Object.keys , имейте в виду, что использование вами дополнительного оператора цепочки ?. приведет к тому, что это будет возможно undefined : вам нужно будет проверить это самостоятельно.