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
使得无法可靠地确定 req
和 res
拥有什么。建议:暂时先注释一下
【讨论】:
以上是关于Typescript 2.2 Express req, res 隐含任何的主要内容,如果未能解决你的问题,请参考以下文章
typescript Express Logger w / TypeScript
「Typescript」[Express] 使用ts封装express
Typescript + Express:类型“typeof e”没有兼容的调用签名