【发布时间】:2021-11-08 06:57:23
【问题描述】:
有一堆SO问题符合这个标题描述,但据我所知,他们都没有回答这个问题。
我正在尝试围绕 express RequestHandler 编写一个包装器,该包装器会捕获异步处理程序中的错误并使用该错误调用 next。
这个想法是我可以做这样的事情:
function tryCatchNext<
P = ParamsDictionary,
ResBody = any,
ReqBody = any,
ReqQuery = ParsedQs,
Locals extends Record<string, any> = Record<string, any>
>(
callback: RequestHandler<P, ResBody, ReqBody, ReqQuery, Locals>
): RequestHandler<P, ResBody, ReqBody, ReqQuery, Locals> {
return async (req, res, next) => {
try {
await callback(req, res, next);
} catch (err) {
next(err);
}
};
}
app.get('/:foo', tryCatchNext(async (req, res, next) => {
// `foo` is not a known parameter, but no error
if (req.params.foo === 'bar') {
throw new Error('That was a bar.');
}
// does not result in an error
// @ts-expect-error
console.log(req.params.bar);
res.send('Not a bar');
}));
如果我只有处理程序,req 知道它的params。在tryCatchNext() req 内没有。我怀疑这是因为它试图从传递给它的回调中推断返回值,而不是其上下文的泛型类型。
如果我在它前面加上一个无操作处理程序,它就可以完美地工作,这样.get() 的...handlers 休息参数就已经被推断出来了。
app
.get('/:foo', (req, res, next) => next(), tryCatchNext(async (req, res, next) => {
// ...
}));
有没有办法在不明确指定每个泛型类型参数的情况下解决这个问题?
【问题讨论】:
-
请分享带有突出显示错误的可重现示例
-
正在处理它,但没有错误,因为默认的
req.params只是一个Record<string, string>。 -
好的,只要在你有问题的那一行评论一下
-
我知道你的痛苦))
-
您是否尝试过超载
app.get?
标签: typescript