使用TypeScript扩展Express Request对象

我试图得到TypeScript和各种指南如何使用node.js的挂钩,并且expression了在将请求对象传递给中间件之前向它们添加属性的讨论。

当然,对于types脚本,这些属性必须被定义,所以我试图在一个名为local.d.ts的文件中这样做:

/// <reference path="tsd.d.ts" /> import mySql = require('mysql'); declare module Express { export interface Request { dbPool: mySql.IPool; } } 

然后我尝试从我的主代码文件中调用它:

 /// <reference path="typings/tsd.d.ts" /> /// <reference path="typings/local.d.ts" /> ... import express = require('express'); ... var pool = mySql.createPool({ user: "username", ... }); app.use(function (req, res, next) { req.dbPool = pool; }); 

但我得到:“属性'dbPool'不存在types'请求'。” 我究竟做错了什么?

作为解决方法,您可以从express.Requestinheritance接口:

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

然后在您的代码中投射请求:

 (<mysql.Request>req).dbPool... 

另一个选项是从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; } 

并将界面扩展为:

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

但在此之后,您需要先调用模块,然后再调用它:

 var exp = <express.Express>(<any>express)(); 

我知道这是旧的,但洛达什的“分配”方法似乎为我工作,可能会更清洁:

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