Я хотел бы использовать модуль http2
в Узле 10 в сочетании с Express и TypeScript (2.8.x).
In может создать экземпляр сервера с чем-то вроде:
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
равен (, по-видимому, )):
(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
, таким как push, нет?
Так что мне приходится выполнять эти приведения с обоих концов.Теперь, если бы существовал @types/express-http2
, который имел бы все типизации Express, но предполагал базовое ядро http2
, то я бы подумал, что ничего из этого не будет обязательно.Но я не смог найти такую вещь.
Я понимаю, что это сложная проблема с типизацией, потому что все экспресс-наборы, насколько я могу судить, написаны с предположением http
в качестве основного сервисаслой.Насколько я понимаю, сам Express отлично работает с http2
, но проблема в том, что наборы не работают чисто.
Я что-то упустил?
PS - Я бы предпочел Express, но если есть другой веб-фреймворк на основе Node, который лучше поддерживает эту комбинацию http2
и TypeScript, я мог бы рассмотреть это также.