Extensión del objeto Express Request utilizando TypeScript

Estoy tratando de entender TypeScript y varias guías sobre cómo usar node.js y hablar expresamente sobre agregar propiedades al objeto Request antes de pasarlas a través del middleware.

Por supuesto, para las secuencias de comandos de tipo, estas propiedades deben definirse, así que intenté hacerlo en un archivo llamado local.d.ts:

///  import mySql = require('mysql'); declare module Express { export interface Request { dbPool: mySql.IPool; } } 

Entonces trato de llamarlo desde mi archivo de código principal:

 ///  ///  ... import express = require('express'); ... var pool = mySql.createPool({ user: "username", ... }); app.use(function (req, res, next) { req.dbPool = pool; }); 

Pero me sale: “La propiedad ‘dbPool’ no existe en el tipo ‘Solicitud'”. ¿Qué estoy haciendo mal?

Como solución alternativa, puede heredar la interfaz de express.Request :

 declare module 'mysql' { import express = require('express'); interface Request extends express.Request { dbPool: IPool; } } 

y luego emitir solicitud en su código:

 (req).dbPool... 

Otra opción es eliminar la statement de función de express.d.ts :

 declare module "express" { import * as http from "http"; //- function e(): e.Express; //- //- module e { interface I_1 { } ... interface I_N { } //- } //- //- export = e; } 

y extender la interfaz como:

 declare module 'express' { import mysql = require('mysql'); interface Express { dbPool: mysql.IPool; } } 

pero después de eso necesitas lanzar el módulo antes de llamarlo:

 var exp = (express)(); 

Sé que esto es antiguo, pero el método de “asignación” de lodash parece funcionar para mí, y podría ser más limpio:

 import * as _ from "lodash"; ... app.use(function (req, res, next) { _.assign(req, {dbPool: pool}); });