Shaun
Shaun

Reputation: 2052

Using import for modules in NodeJS causes type errors

TSLint warns against using the var keyword in TypeScript, so I have been using import when importing modules. However, when I do this for local modules, it gives me an error when I tried to use the module.

In a file routes/main.ts I have:

import express = require("express");
let router = express.Router();
router.get("/", (req, res, next) => { ... });

module.exports = router;

In app.ts I have:

/// <reference path="../../typings/main.d.ts" />
import express = require("express");
...
import routes = require("./routes/main");
let app = express();
app.use(routes); // The type error is here.
...

Using import routes causes the following type error when I use it with app.use(routes);:

app.ts(36,13): error TS2345: Argument of type 'typeof ".../source/server...'
is not assignable to parameter of type 'RegExp'.

To fix this I can cast it to a particular type:

app.use(<express.Router>routes);

But there are places where type casting is not as clean. I can switch to using the var keyword when I import the module:

var routes = require("./routes/main");
let app = express();
app.use(routes); // No errors.

But is there a way to satisfy both the compiler and tslint? Or should I not use the "no-var-requires": true setting in tslint when using the CommonJS module style?

Upvotes: 0

Views: 184

Answers (1)

Zen
Zen

Reputation: 5490

Don't use var.
You can replace module.exports = router; with export = router; in routes/main.ts.
You have misunderstood the usage of app.use. You should use app.use("/", routes).

Upvotes: 1

Related Questions