我正试图了解如何使用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'。” 我做错了什么?
答案 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});
});