我想将节点10中的http2模块与Express和TypeScript(2.8.x)结合使用。

可以使用以下方式实例化服务器:

import * as http2 from "http2";

let server = http2.createServer({}, app).listen(8080);


问题是我将得到app的类型错误。问题是http2.createServer希望第二个参数的类型为:

(request: http2.Http2ServerRequest, response: http2.Http2ServerResponse) => void


问题是根据@types/expressapp的类型为(apparently):

(req: Request | http.IncomingMessage, res: Response | http.ServerResponse): any


现在,我可以像这样做一个丑陋的演员:

import * as http2 from "http2";

let server = http2.createServer({}, (app as any) as ((request: http2.Http2ServerRequest, response: http2.Http2ServerResponse) => void)).listen(8080);


但是问题出在后来我编写Express处理程序时,看来我必须将它们编写为:

(req: express.Request, res: express.Response) => {
  let req2 = (req as any) as http2.Http2ServerRequest;
  let res2 = (res as any) as http2.Http2ServerResponse;
  ...
}


...为了访问所有http2功能,例如推,不是吗?

所以我必须在两端进行这些转换。现在,如果有一个@types/express-http2具有所有Express类型,但假定http2的基础是核心,那么我想这些都不一定。但是我找不到这样的东西。

我认识到这是一个棘手的类型问题,因为据我所知,所有Express类型都是以http作为基础服务层编写的。据我了解,Express本身可以与http2一起很好地工作,但是问题是键入不能正常工作。

我想念什么吗?

附言-我更喜欢Express,但是如果有另一个基于Node的Web框架更好地支持http2和TypeScript的这种组合,我也可以考虑这样做。

最佳答案

这行不通。内部express使用http模块。

您可以在执行操作时对其进行强制转换,但是您通过将其强制转换为any然后在最终不是http2.Http2ServerRequest时再次强制转换为http2.Http2ServerRequest来进行某种黑客攻击。

http2支持有一个开放的PR:https://github.com/expressjs/express/pull/3390

关于node.js - HTTP2的快速类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50574125/

10-10 17:23