Typescript 2.2 Express req, res 隐含任何

Posted

技术标签:

【中文标题】Typescript 2.2 Express req, res 隐含任何【英文标题】:Typescript 2.2 Express req, res implicitly any 【发布时间】:2017-07-22 11:01:05 【问题描述】:

我在向 node/express 项目添加类型方面有点挣扎。

我正在使用 TypeScript 2.2 和 express 4.x,并且我已经通过 npm 安装了类型:

npm install --save-dev @types/express

import * as express from "express"

const app: express.Application = express()

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

这给了我:

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.

我试图避免对所有请求处理程序都这样做:

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

在我看来,它应该能够推断出这些。我错了吗?这不可能吗?

tsconfig.json:


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

谢谢!

【问题讨论】:

您可以将 noImplicitAny 更改为 false,或更改您的每条路线。你不能同时拥有它 我不同意 Varedis 的观点,并且可以确认您编写的代码确实应该可以工作,并且应该自动输入 (req, res),因为 app.get 有一个类型。如果您使用 vscode(或任何其他处理 typescript 足够好的编辑器),请尝试在express.Application 上执行“转到定义”。我唯一能想到的是,不知何故你没有从node_modules/@types 得到类型。还可以尝试使用 --traceResolution 标志运行 typescript 并查看 express 类型的实际来源。 这能回答你的问题吗? How to add Typescript definitions to Express req & res 【参考方案1】:

尝试添加Express类型

import Express from 'express'
var express = require('express')

const app:Express = express();

app.get('/test', (req, res) => 
  res.send( message: 'Welcome to Express!' );
);

【讨论】:

【参考方案2】:

express 库的 get 方法重载过重(见这里演示 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;

RequestHandlerParams 使得无法可靠地确定 reqres 拥有什么。建议:暂时先注释一下

【讨论】:

以上是关于Typescript 2.2 Express req, res 隐含任何的主要内容,如果未能解决你的问题,请参考以下文章

typescript Express Logger w / TypeScript

Typescript - 导入 Express 不起作用

「Typescript」[Express] 使用ts封装express

Typescript + Express:类型“typeof e”没有兼容的调用签名

TypeScript:用自己的类扩展 Express.Session 接口

如何在 Typescript 项目中使用 express-mysql-session?