我想将节点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/express
,app
的类型为(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/