2017-03-02 4 views
2

Ich struggeling ein bisschen mit dem Hinzufügen von Typen zu einem Knoten/Express-Projekt.Typescript 2.2 Express req, res implizit beliebig

Ich verwende Typoskript 2.2 und Express 4.x und ich habe Typen durch NPM installiert:

npm install --save-dev @types/express

import * as express from "express" 

const app: express.Application = express() 

app.get("/hello", (req, res) => { 
    res.send("world") 
}) 

Das gibt mir:

src/app.ts(33,22): error TS7006: Parameter 'req' implicitly has an 'any' type. 
src/app.ts(33,27): error TS7006: Parameter 'res' implicitly has an 'any' type. 

Ich bin versuchen zu vermeiden, dies für alle Anforderungshandler tun zu müssen:

(req: express.Request, res: express.Response) => {} 

Meiner Meinung nach sollte es in der Lage sein, diese zu schließen. Liege ich falsch? Ist das nicht möglich?

tsconfig.json:

{ 
    "compilerOptions": { 
    "target": "es6", 
    "module": "commonjs", 
    "noImplicitAny": true, 
    "sourceMap": true, 
    "outDir": "dist", 
    "typeRoots": ["src/types", "node_modules/@types"] 
    }, 
    "include": [ 
    "src/**/*.ts" 
    ] 
} 

Dank!

+0

Sie konnten 'noImplicitAny' zu false ändern, oder ändern Sie jede Ihrer Routen. Du kannst es nicht auf beide Arten haben – Varedis

+0

Ich stimme Varedis nicht zu und kann bestätigen, dass der Code, den du geschrieben hast, funktionieren sollte und '(req, res)' sollte automatisch getippt werden, da 'app.get' einen Typ hat. Wenn Sie vscode verwenden (oder einen anderen Editor, der Typoskript gut genug beherrscht), versuchen Sie "go to definition" auf "express.Application". Das einzige, was mir einfällt, ist, dass Sie die Typen nicht irgendwie von 'node_modules/@ types' bekommen. Versuchen Sie auch, Typoskript mit '--traceResolution'-Flag auszuführen und zu sehen, woher die Express-Typen tatsächlich kommen. –

Antwort

1

Die get-Methode ausdrückliche Bibliothek ist zu stark überlastet (siehe hier für Demo https://github.com/DefinitelyTyped/DefinitelyTyped/blob/14cfa9f41c2835fcd22e7243a32b25253c310dee/express-serve-static-core/index.d.ts#L25-L40)

interface RequestHandler { 
    (req: Request, res: Response, next: NextFunction): any; 
} 

interface ErrorRequestHandler { 
    (err: any, req: Request, res: Response, next: NextFunction): any; 
} 

type PathParams = string | RegExp | (string | RegExp)[]; 

type RequestHandlerParams = RequestHandler | ErrorRequestHandler | (RequestHandler | ErrorRequestHandler)[]; 

interface IRouterMatcher<T> { 
    (path: PathParams, ...handlers: RequestHandler[]): T; 
    (path: PathParams, ...handlers: RequestHandlerParams[]): T; 
} 

Die RequestHandlerParams macht es unmöglich, über zuverlässig sicher zu sein, was req und res haben. Vorschlag: notieren Sie es für jetzt

Verwandte Themen