使用TypeScript扩展Express Request对象

时间:2015-08-12 23:23:17

标签: node.js express typescript

我正试图了解如何使用node.js的TypeScript和各种指南,并在将它们传递给中间件之前表达关于向Request对象添加属性的讨论。

当然,对于类型脚本,必须定义这些属性,所以我尝试在名为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'。” 我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

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)();

答案 1 :(得分:0)

我知道这是旧的,但是lodash的“assign”方法似乎对我有用,而且可能更清洁:

import * as _ from "lodash";

...

app.use(function (req, res, next) {
    _.assign(req, {dbPool: pool});
});