2015-08-12 2 views
4

Я пытаюсь получить виджеты TypeScript и различных руководств о том, как использовать node.js и выразить разговор о добавлении свойств в объект Request, прежде чем передавать их через промежуточное программное обеспечение.Расширение объекта экспресс-запроса с использованием TypeScript

Конечно, для типа сценария эти свойства должны быть определены таким образом, я попытался сделать это в файле с именем 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 »не существует в типе« Запрос ». Что я делаю неправильно?

ответ

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

Когда я это делаю, появляется «тестовый» интерфейс, размещенный в том же файле, но расширение все еще не работает. Он также генерирует «Назначение экспорта не может использоваться в модуле с другими экспортируемыми элементами». Ошибка в исходном файле express.d.ts. – Nidonocu

+0

Это проблема с порочным кругом, и я думаю, что [должно быть сообщено] (https://github.com/Microsoft/TypeScript/issues). Я нашел некоторое обходное решение. – Artem

0

Я знаю, что это старый, но lodash в «назначить» метод, кажется, работает для меня, и может быть чище:

import * as _ from "lodash"; 

... 

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

Просто понял, что, хотя это решение позволит вам назначить свойство, у вас все еще будут проблемы с доступом к нему после ... так что это не работает. –