对象可能是“未定义”的,并且无法调用可能是“未定义”的对象

时间:2020-05-13 05:23:34

标签: node.js typescript express

嗨,我宣布了这个功能图。这个想法是在JSON文件中获取一个对象并对其进行过滤。 因此,我为每个键创建了一个过滤器功能。

const filterMap: Map<
  string,
  (ticket: Ticket, filter: request) => boolean
> = new Map();
filterMap.set(
  "after",
  (ticket: Ticket, filter: request) =>
    ticket.creationTime >= parseDate(filter.date)
);
filterMap.set(
  "before",
  (ticket: Ticket, filter: request) =>
    ticket.creationTime <= parseDate(filter.date)
);
filterMap.set(
  "from",
  (ticket: Ticket, filter: request) => ticket.userEmail === filter.email
);
filterMap.set("filter", (ticket: Ticket, filter: request) =>
  ticket.content.includes(filter.filter)
);
filterMap.set("", (ticket: Ticket, filter: request) =>
  ticket.content.includes(filter.filter)
);

我想在代码中尝试使用它

 const filteredTickets = tempTicketsData.filter((ticket:Ticket) => {
      if (request.kind)
        return (
      // @ts-ignore

          filterMap.get(request.kind)(ticket, request) &&
          // @ts-ignore
          filterMap.get("filter")(ticket, request)
        );
      else {
        // @ts-ignore
        return filterMap.get("filter")(ticket, request);
      }
    });

标题中的问题发生在我评论过/// @ ts-ignore的地方? 我该如何解决?

1 个答案:

答案 0 :(得分:0)

Map.prototype.get函数的返回值为V | undefined(假设V是存储在映射中的值的通用类型),因为如果您尝试通过映射中不存在的键,则该函数将返回undefined。由于这个事实,TypeScript无法在编译时知道您的键值对是否在映射中,因此您会收到错误消息,因为您没有检查值是否不是{{1} },然后再尝试使用它们。为此添加检查,错误将消失:

undefined

const filteredTickets = tempTicketsData.filter((ticket:Ticket) => { const filter = filterMap.get("filter"); if (request.kind) const kind = filterMap.get(request.kind); if (!kind || !filter) return false; // check for undefined value return ( kind(ticket, request) && filter(ticket, request) ); if (!filter) return false; // check for undefined value return filter(ticket, request); }); 语句之后也不需要else。另外,您应该在return检查之后将return false更改为在两个值均为undefined时要函数返回的值