嗨,我宣布了这个功能图。这个想法是在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的地方? 我该如何解决?
答案 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
时要函数返回的值