扩展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

我已经开始做的是:

  1. flow-typed install express@4.xx
  2. express_v4.xxjs从flow-typed / npm /移动到flow-typed /(在flow-typed / npm /之外),这样不会被将来的stream式安装覆盖,并且flow-typed / so内部会自动declare blah声明全球)
  3. 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; }; }

我这样做,而不是把我的自定义道具放在原来的类,这样很容易看到哪些道具是自定义的。