明确指定Express'"应用程序,请求,响应......的类型"

And*_*ell 14 express typescript

我正在努力更新一个简单的NodeJS + ExpressJS应用程序以使用TypeScript.我已经有了它的工作,但我正在添加一些额外的数据注释,以在Visual Studio和WebStorm中添加额外的类型检查和代码时自动完成/ IntelliSense.

我已经引用了最新的express.d.ts.我还创建了Express应用程序:

var app = express();
Run Code Online (Sandbox Code Playgroud)

一切正常......但是当我输入类似的内容时,我似乎无法弄清楚如何为app添加类型信息以获取自动完成帮助

app.get('/',function(req,res){});
Run Code Online (Sandbox Code Playgroud)

我尝试使用(和&)注释应用程序(和req&res)Express.Application,但这并没有解决.看一下类型定义,我对如何编写typedef与创建内部"e"引用感到困惑.......Request.Response

感到惊讶我找不到任何人要求和解决这个问题,因为express.d.ts typedef已针对ExpressJS 4.0进行了更新(之前我发现了对ExpressServer的引用,但现在还没有.

想法?

And*_*ell 43

经典案例"一段时间没有成功的事情,但当你最后发出一个问题寻求帮助时,你会立即弄明白".

解决方案:当您要使用其中一种类型时,必须导入模块,因为typedef位于typedef中的命名模块中.

在上面的代码中(位于我的app.ts中),我在app上获得了类型注释.因为我在文件顶部的import语句是import express = require('express');,我可以像这样注释req&res params:

app.get('/', function(req:express.Request, res:express.Response){});
Run Code Online (Sandbox Code Playgroud)

在其他文件中,我试图在应用程序上获取类型注释,我错过了文件顶部的import语句.添加后,我可以添加注释,如:

public init(app: express.Application){}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我正在使用存在的“Express.Application”,但有不同的类型! (2认同)

小智 23

我认为其中一些答案可能已经过时。以下对我有用:

import { Request, Response } from 'express';
Run Code Online (Sandbox Code Playgroud)

  • 在 `app.use(function (req: Request, res: Response, next: ?) { throw new Error('NoRoutesMatched'); });` 中导入什么类型 (2认同)
  • @ShubhamShaw我还导入了NextFunction,就像这样 `import { Request, Response, NextFunction } from 'express';` 然后像这样使用它 `function myReqHandler (req: Request, res: Response, next: NextFunction) { ... } ` (2认同)

Sam*_*Sam 18

如果有人在2017年绊倒这个问题并使用更现代的TS.你应该能够正义npm install @types/express然后它应该工作.

  • 其他人绊脚石,请确保您正在执行“ app = express()”,而不是“ app = new express()”。 (2认同)