我正在使用Passport来处理Express应用程序的身份验证。这会将用户设置为Express响应。我正在使用TypeScript,因此在路由定义中将请求类型设置为Request将会出错,因为Express请求中不存在用户对象。有关延长请求的问题很多,可以是declaration merging或extending the interface,但这会导致另一个错误。我的文件看起来像这样:
import { Router, Request, Response } from 'express'
import { User as CustomUser } from './user'
interface IRequest extends Request {
user: CustomUser
}
const router: Router = Router()
router.get('/', requiresLogin, (req: IRequest, res: Response) => {
console.log(req.user)
res.sendStatus(204)
})
但现在我在快速回调中获得了以下TypeScript:
Argument of type '(req: IRequest, res: Response) => void' is not assignable to parameter of type 'RequestHandlerParams'. Type '(req: IRequest, res: Response) => void' is not assignable to type '(RequestHandler | ErrorRequestHandler)[]'. Property 'includes' is missing in type '(req: IRequest, res: Response) => void'.
我最近升级到TypeScript v2.8.3,之前从未遇到过这个问题。
答案 0 :(得分:0)
我只是遇到了类似的问题,并像这样解决了它:
import { Router, Request, Response } from 'express';
import { User as CustomUser } from './user';
const router: Router = Router();
router.get('/', requiresLogin, (req: Request, res: Response) => {
console.log(req.user as CustomUser);
res.sendStatus(204);
});
我没有增加Express.js请求类型,而是简单地告诉TypeScript使用类型断言,req.user将是CustomUser类型。这似乎是文档中的引用的确切情形:“有时您最终会遇到比TypeScript更了解值的情况。”
https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions
现在我知道您在想什么。 “如果没有用户怎么办?这不会违反Typescript的目的吗?”。好吧,让我们来看一下。如果您使用的是Passport.js,那么没有用户的帮助就不算多。这段代码应该在您的Passport配置内:
if (!user) {
/** Set status code to Unauthorized */
res.status(401);
return next(err);
}
至于打败Typescript ...也许你是对的。如果有人对此情况有更好的答案,我会为之倾听。
答案 1 :(得分:-1)
如果您无法明确地从Express导入Request
,Response
或NextFunction
,而是使用Node in-builts(签名稍有不同),则可能会发生这种情况。< / p>
尝试将以下内容添加到中间件定义中:
从'express'导入{Request,Response,NextFunction};
请参阅https://github.com/DefinitelyTyped/DefinitelyTyped/issues/26146#issuecomment-393386416