【问题标题】:Declaration merging and aliasing not working together声明合并和别名不能一起工作
【发布时间】:2015-05-04 10:24:00
【问题描述】:

我最近开始将我的 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 模块有两个独立的定义。第一个也存在于其他模块中,例如express-session.d.tsconnect-flash.d.ts,并且它们正确合并在一起。但是express.d.ts文件的大小写差异似乎有问题。有没有办法合并它们?

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

    我试图在任何地方都明确。但是,如果 typescript 可以为您推断,您可以避免这种情况。

    我收到以下错误:

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

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

    这两种不同的模块。 declare module foo 表示全局变量 foo 可用。 declare module "foo" 表示你可以做到import foo = require('foo')

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

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

    【讨论】:

    • 啊,这已经解释了很多。我刚刚注意到,如果我将导入更改为import Express = require('express');,则“大写字母表示”版本有效。谢谢!
    猜你喜欢
    • 2017-03-23
    • 2021-08-17
    • 2021-10-12
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2019-08-17
    相关资源
    最近更新 更多