#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
: вам нужно будет проверить это самостоятельно.