簡體   English   中英

使用TypeScript擴展Express Request對象

[英]Extending Express Request object using TypeScript

我試圖了解TypeScript和各種指南,了解如何使用node.js並表達關於在將Request屬性傳遞給中間件之前向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'在'Request'類型上不存在。” 我究竟做錯了什么?

作為解決方法,您可以從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)();

我知道這是舊的,但是lodash的“assign”方法似乎對我有用,而且可能更清潔:

import * as _ from "lodash";

...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM