声明合并和别名不能一起工作

时间:2015-05-04 02:12:53

标签: node.js express intellij-idea typescript webstorm

我最近开始将node.js / express应用程序转换为typescript。

到目前为止它运作良好,但有一些我不确定的事情:

我注意到在sample project by Microsoft中,他们与他们的输入不一致。

app.ts

app.get('/findImages', function(req, res) {
    // ...
}

路由/ index.ts

export function index(req: express.Request, res: express.Response) {
    // ....
};

正如您所看到的,它们有时会定义类型,有时则不然。我注意到在第一种情况下没有IntelliSense,但这也可能是IntelliJ的一个问题。这里最好的做法是什么?

起初我以为我会输入所有内容,但后来我发现了另一个奇怪的行为:

app.ts

/// <reference path="connect-flash/connect-flash.d.ts" />
/// <reference path="express-session/express-session.d.ts" />
/// <reference path="express/express.d.ts" />
/// <reference path="passport/passport.d.ts" />

import express = require('express');
import session = require('express-session');
import passport = require('passport');
import flash = require('connect-flash');

var app: express.Express = express();

// Express without capital letter
route.get('/', function (req: express.Request, res: express.Response): void {
    req.flash('message');       // no IntelliSense
    var session = req.session;  // no IntelliSense
    var ip = req.ip;            // works
    var test = req.params.test; // works
});

// Express with capital letter
route.get('/', function (req: Express.Request, res: Express.Response): void {
    req.flash('message');       // works
    var session = req.session;  // works
    var ip = req.ip;            // no IntelliSense; compile error TS2339
    var test = req.params.test; // no IntelliSense; compile error TS2339
});

我收到以下错误:

Error:(54, 22) TS2339: Property 'ip' does not exist on type 'Request'.
Error:(55, 24) TS2339: Property 'params' does not exist on type 'Request'.

我正在查看定义文件,并注意到显然有两种不同的方法来定义模块:

express.d.ts

declare module Express {...}
declare module "express" {...}

我尝试了大小写的多种组合(也在其他定义文件中)但没有成功。

似乎快递模块有两个单独的定义。第一个也出现在其他模块中,例如express-session.d.tsconnect-flash.d.ts,它们正确地合并在一起。但是express.d.ts文件中的大小写差异似乎存在问题。有没有办法合并它们?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

正如您所看到的,它们有时会定义类型,有时则不然。我注意到在第一种情况下没有IntelliSense,但这也可能是IntelliJ的一个问题。这里最好的做法是什么

我试着在任何地方都明白。但是如果打字稿可以为你推断它,你可以避免这种情况。

  

我收到以下错误:

如果ip是快递请求的一部分,那么这只是express.d.ts中需要修复的遗漏。

  

注意到显然有两种不同的方式来定义模块:

这两个不同的类模块。 declare module foo表示这是一个可用的全局变量foodeclare module "foo"表示您可以执行import foo = require('foo')

  

但是express.d.ts文件中的大小写差异似乎存在问题。有没有办法合并它们

他们应该都有相同的案例。