[英]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.