Explicitly Specifying types for Express' "application, request, response..."

I'm working to update a simple NodeJS + ExpressJS app to use TypeScript. I've got it working, but I'm having fits adding some extra data annotations to add extra type checking and code-time autocomplete/IntelliSense in Visual Studio & WebStorm.

I've got the latest express.d.ts referenced. I've also created the Express app:

var app = express();

Everything works... but I can't seem to figure out how to add the type info for app for autocomplete assistance when you type something like

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

I've tried annotating app (and req & res) using Express.Application (and .Request & .Response) but that isn't resolving. Looking at the type definition I'm getting confused with how the typedef is written creating the internal "e" reference...

Surprised I can't find anyone asking & resolving this since the express.d.ts typedef was updated for ExpressJS 4.0 (previously I found references to ExpressServer but that isn't present today.

Ideas?


Classic case of "work on something for a while with no success, but when you finally post a question asking for help, you figure it out immediately".

The solution: When you want to use one of the types, you have to import the module as the typedef is in a named module within the typedef.

In the above code (that resided in my app.ts), I was getting the type annotations on app. Because my import statement at the top of the file was import express = require('express');, I could annotate the req & res params like this:

app.get('/', function(req:express.Request, res:express.Response){});

In other files, where I was trying to get type annotations on the app, I was missing the import statement at the top of the file. Once added, I could add the annotations for that as well like:

public init(app: express.Application){}

In case anyone stumbles on this question in 2017 and using a more modern TS. You should be able to just npm install @types/express and then it should just work.


I think some of these answers may be dated. The following worked for me:

import { Request, Response } from 'express';