在 Flow 中扩展快速请求 class
extending express request class in Flow
我正在使用 Flow 构建一个 nodeJS 应用程序,我需要扩展 express$Request 的默认快速注释以适应我添加的其他字段,例如 .user 和 .session。
不幸的是,当我尝试这样做并创建接受这种新请求类型的中间件时,Flow 崩溃了,我不确定我做错了什么。
流式表达的原始代码是:
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);
所以我想我会扩展 express$Request 然后我的所有中间件都应该使用新属性,对吗?
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.x.x.js: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.x.x.js:97
Member 2:
function type: flow-typed/npm/express_v4.x.x.js:98
Error:
web$Request: web/src/index.js:114
This type is incompatible with an argument type of
null: flow-typed/npm/express_v4.x.x.js:98
任何人都可以解释这里发生了什么以及如何解决它吗?
谢谢!
该错误表明类型为 express$Request
(成员 1)或 null
(成员 2)的 argument/param 是预期的,但看到了 web$Request
。
很遗憾,Flow 不支持 extending/overriding flow/lib 类型:
https://github.com/facebook/flow/issues/396
我开始做的是:
flow-typed install express@4.x.x
- 将
express_v4.x.x.js
从 flow-typed/npm/ 移动到 flow-typed/(在 flow-typed/npm/ 之外,这样它就不会被未来的 flow-typed 安装覆盖,并且在 flow-typed 内部/ 所以流将自动使 declare blah
语句全局)
在 declare class express$Request...
的正下方(所以很容易找到,所以它在 declare module...
中使用的位置上方,我输入:
declare class express$Request extends express$Request {
user: any;
isAuthenticated(): boolean;
session: {
loginForwardUrl: ?string;
};
}
我这样做而不是将我的自定义道具放在原来的 class 上,这样很容易看出哪些道具是自定义的。
如果你不想修改原来的 flow-typed/npm/express_v4.x.x.js 你可以使用流程 intersection types:
import type {$Request} from 'express';
type MyType = {
foo: string
}:
export type CustomRequest = $Request & {
foo: MyType | void;
bar: string | void
};
我喜欢这种方法,因为我可以将自己的类型定义添加到 CustomRequest。在 typed/npm/express_v4.x.x.js 文件中扩展 $Request 时可能会很棘手。
我正在使用 Flow 构建一个 nodeJS 应用程序,我需要扩展 express$Request 的默认快速注释以适应我添加的其他字段,例如 .user 和 .session。
不幸的是,当我尝试这样做并创建接受这种新请求类型的中间件时,Flow 崩溃了,我不确定我做错了什么。
流式表达的原始代码是:
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);
所以我想我会扩展 express$Request 然后我的所有中间件都应该使用新属性,对吗?
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.x.x.js: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.x.x.js:97
Member 2:
function type: flow-typed/npm/express_v4.x.x.js:98
Error:
web$Request: web/src/index.js:114
This type is incompatible with an argument type of
null: flow-typed/npm/express_v4.x.x.js:98
任何人都可以解释这里发生了什么以及如何解决它吗?
谢谢!
该错误表明类型为 express$Request
(成员 1)或 null
(成员 2)的 argument/param 是预期的,但看到了 web$Request
。
很遗憾,Flow 不支持 extending/overriding flow/lib 类型:
https://github.com/facebook/flow/issues/396
我开始做的是:
flow-typed install express@4.x.x
- 将
express_v4.x.x.js
从 flow-typed/npm/ 移动到 flow-typed/(在 flow-typed/npm/ 之外,这样它就不会被未来的 flow-typed 安装覆盖,并且在 flow-typed 内部/ 所以流将自动使declare blah
语句全局) 在
declare class express$Request...
的正下方(所以很容易找到,所以它在declare module...
中使用的位置上方,我输入:declare class express$Request extends express$Request { user: any; isAuthenticated(): boolean; session: { loginForwardUrl: ?string; }; }
我这样做而不是将我的自定义道具放在原来的 class 上,这样很容易看出哪些道具是自定义的。
如果你不想修改原来的 flow-typed/npm/express_v4.x.x.js 你可以使用流程 intersection types:
import type {$Request} from 'express';
type MyType = {
foo: string
}:
export type CustomRequest = $Request & {
foo: MyType | void;
bar: string | void
};
我喜欢这种方法,因为我可以将自己的类型定义添加到 CustomRequest。在 typed/npm/express_v4.x.x.js 文件中扩展 $Request 时可能会很棘手。