扩展Flow中的快速请求类
我正在使用Flow构buildnodeJS应用程序,而且我需要扩展Express Request的默认快速注释以适应其他字段,例如.user和.session。
不幸的是,当我尝试这样做,并创build接受这个新的请求types的中间件时,Flow吓了一跳,我不知道我做错了什么。
从stream式inputexpression的原始代码是:
declare class express$Request extends http$IncomingMessage mixins express$RequestResponseBase { .... } declare type express$Middleware = ((req: express$Request, res: express$Response, next: express$NextFunction) => mixed) | ((error: ?Error, req: express$Request, res: express$Response, next: express$NextFunction) => mixed);
所以我想我只是扩展快速请求,然后我所有的中间件都应该与新的属性,对不对?
declare class web$Request extends express$Request { user: any, isAuthenticated(): boolean, session: { loginForwardUrl: ?string, }, } const authenticationMiddleware: express$Middleware = ( req: web$Request, res, next ): mixed => { if (req.isAuthenticated()) { return next(); } req.session.loginForwardUrl = req.originalUrl; return res.redirect('/auth/login/google'); }
不幸的是,这会产生超复杂的错误:
function This type is incompatible with union: function type(s): web/src/index.js:113 Member 1: function type: flow-typed/npm/express_v4.xxjs:97 Error: web$Request: web/src/index.js:114 This type is incompatible with the expected param type of express$Request: flow-typed/npm/express_v4.xxjs:97 Member 2: function type: flow-typed/npm/express_v4.xxjs:98 Error: web$Request: web/src/index.js:114 This type is incompatible with an argument type of null: flow-typed/npm/express_v4.xxjs:98
任何人都可以解释这里发生了什么,以及如何解决它?
谢谢!
该错误说预计会有一个typesexpress$Request
(Member 1)或null
(Member 2)的参数/参数,但web$Request
看到web$Request
。
不幸的是,Flow不支持扩展/重载stream/ libtypes:
https://github.com/facebook/flow/issues/396
我已经开始做的是:
-
flow-typed install express@4.xx
- 将
express_v4.xxjs
从flow-typed / npm /移动到flow-typed /(在flow-typed / npm /之外),这样不会被将来的stream式安装覆盖,并且flow-typed / so内部会自动declare blah
声明全球) -
在
declare class express$Request...
下面,declare class express$Request...
(所以很容易find,所以它在declare module...
里面使用的地方declare module...
,我把:declare class express$Request extends express$Request { user: any; isAuthenticated(): boolean; session: { loginForwardUrl: ?string; }; }
我这样做,而不是把我的自定义道具放在原来的类,这样很容易看到哪些道具是自定义的。