node.js - Typescript kompilering fel: Egenskapen 'bodyParser' finns inte på typen 'typeof e'


Jag vill använda TypeScript i min Node/Express-miljö, med hosting i Cloud 9 IDE.

Jag har ett problem när jag försöker få kompilatorn att kompilera app.ts. Det uppstår flera fel, varav Property 'bodyParser' does not exist on type 'typeof e' är ett av dem.

Jag har flera definitionsfiler i rotmappen av applikationen, nämligen express.d.ts, node.d.ts, body-parser.d.ts. Jag lade till body-parser.d.ts i desperation i tron att felet med body parser skulle lösas.

Kommandoraden är: tsc --sourcemap --module commonjs app.ts Koden i app.ts är som följer:

// Import express with body parsers (for handling JSON)
import express = require('express');
var bodyParser = require('body-parser');

var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
var expressValidator = require('express-validator');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.bodyParser());
app.use(expressValidator([]));

// add session support!
app.use(express.cookieParser());
app.use(express.session({ secret: 'sauce' }));

app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

// Uncommend this line to demo basic auth
// app.use(express.basicAuth((user, password) => user == "user2" && password == "password"));


// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

function restrict(req, res, next) {
  if (req.session.authenticated) {
    next();
  } else {
    res.redirect('/');
  }
}

// Get
app.get('/', routes.index);
app.get('/login', routes.login);
app.get('/register', routes.register);
app.get('/users', user.list);
app.get('/AddPlayer', routes.addPlayer);
app.get('/dashboard', restrict, routes.dashboard);
app.get('/logout', routes.logout);

// POST
app.post('/AddPlayer', routes.AddPlayer);
app.post('/login', routes.loginUser);
app.post('/register', routes.registerUser);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

Svar #1

Jag tycker inte att du ska använda TSD, typings är den nya standarden. Och du kan få det genom att använda npm. För att få express genom typings kan du använda dessa kommandon för att installera alla beroenden för express

typings install express --ambient --save
typings install serve-static --ambient --save
typings install express-serve-static-core --ambient --save
typings install mime --ambient --save

Svar #2

Du lade inte till någon typinformation i din ts-fil. Felet 'typeof e' är typeof express som är deklarerat men saknar typ.

express i detta fall är helt enkelt identifieraren, namnet på variabeln.

Den enda Typescript-funktionen du använde är import-satsen, men den kanske inte behövs i det fallet

Jag kör på en var och glömmer TS-moduldefinitioner. helt enkelt var express=require('express')

Istället för att slänga typdefinitioner i din rotmapp, försök använda TSD eller Nuget om du är på Windows (jag rekommenderar starkt TSD framför Nuget).

Detta kommer att skapa viss ordning i ditt projekt och saker kommer börja få mening. tsd gör det mycket enkelt för dig att börja med

På kommandoraden

npm init
npm install tsd  --save-dev
#you couldalso install it globally first , with
npm install tsd -g
once done, initialize it 
tsd init
#then get the definitions you need 
tsd query node express --action install --save
tsd will place the definitions under typings\tsd.d.ts for you

då kan du lägga till referensen i ditt skript

/// <reference path='typings/tsd.d.ts' />

nu är det dags att lägga till typinformationen

Det kommer fortfarande inte att fungera men åtminstone kommer det att kompileras :)

Det är första gången jag tittar på Express definitionsfil och jag har känslan av att den kanske inte hjälper så mycket. Express har förändrats en del på senaste tiden och jag är inte säker på hur exakt definitionsfilen kan vara. Och dessutom är Express ganska dynamiskt, d.ts är full av any's.. :) Jag är inte säker på om du kommer få någon verklig nytta av typdefinitionerna med Express, men du kan fortfarande få några bra funktioner från TypeScript och bygga dina egna typer/gränssnitt eller utöka de befintliga med det du förväntar dig.