Sim*_*n H 3 node.js express typescript
我有一套用于REST API的控制器函数,我得到了很多以下内容
error TS7006: Parameter 'req' implicitly has an 'any' type.
Run Code Online (Sandbox Code Playgroud)
同样地res.我一直在玩打字等但没有成功.例如,Request下面的类型参数不起作用.
以下是控制器文件的示例.参考路径是正确的.
/// <reference path="../../../typings/tsd.d.ts" />
/* globals require */
"use strict";
exports.test = (req : Request, res) => {
Run Code Online (Sandbox Code Playgroud)
我尝试添加import * as express from "express";到文件中 - 我不需要它正常,因为这些函数被导出并由index.js使用,它实际上实现了路由.
这是tsd.d.ts
/// <reference path="requirejs/require.d.ts" />
/// <reference path="express/express.d.ts" />
/// <reference path="mime/mime.d.ts" />
/// <reference path="node/node.d.ts" />
/// <reference path="serve-static/serve-static.d.ts" />
/// <reference path="bluebird/bluebird.d.ts" />
/// <reference path="mongoose/mongoose.d.ts" />
Run Code Online (Sandbox Code Playgroud)
Jon*_*002 28
每次需要编写中间件函数时都键入参数可能会令人生畏,因此您也可以直接键入整个函数。
npm i @types/express --save-dev ("@types/express": "^4.17.0")
Run Code Online (Sandbox Code Playgroud)
安装打字机后..
// This can be shortened..
import { Request, Response, NextFunction } from 'express';
export const myMiddleware = (req: Request, res: Response, next: NextFunction) => {
...
};
// to this..
import { RequestHandler } from 'express';
export const myMiddleware: RequestHandler = (req, res, next) => {
...
};
// or in case it handles the error object
import { ErrorRequestHandler } from 'express';
export const myMiddleware: ErrorRequestHandler = (err, req, res, next) => {
...
};
Run Code Online (Sandbox Code Playgroud)
Jam*_*mie 18
我发现您可以非常有效地利用 TypeScript 泛型来创建围绕 ExpressRequest类型的包装器。
您可以在接口文件/文件夹中声明与此类似的内容:
import { NextFunction, Request, Response } from 'express';
type TypedRequest<
ReqBody = Record<string, unknown>,
QueryString = Record<string, unknown>
> = Request<
Record<string, unknown>,
Record<string, unknown>,
Partial<ReqBody>,
Partial<QueryString>
>;
export type ExpressMiddleware<
ReqBody = Record<string, unknown>,
Res = Record<string, unknown>,
QueryString = Record<string, unknown>
> = (
req: TypedRequest<ReqBody, QueryString>,
res: Response<Res>,
next: NextFunction
) => Promise<void> | void;
Run Code Online (Sandbox Code Playgroud)
TypedRequest实际上是 Express 接口的包装器Request,并用您传递给它的泛型填充它,但也是可选的(注意。然后它还会在每个泛型周围Record<string, unknown>应用 a (您可能希望将其改为 a )PartialDeepPartial
ExpressMiddleware接受 3 个可选泛型ReqBody Res和QueryString. 它们用于构造类似于中间件/控制器的函数签名。
然后,上面的内容允许您强类型和消费,如下所示:
import { ExpressMiddleware } from '../interfaces/ExpressMiddleware';
type Req = { email: string; password: string };
type Res = { message: string };
export const signupUser: ExpressMiddleware<Req, Res> = async (req, res) => {
/* strongly typed `req.body`. yay autocomplete */
res.json({ message: 'you have signed up' }) // strongly typed response obj
};
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助别人。这对我的 Express 体验产生了巨大的影响。
小智 10
您可以使用名为import的ES6样式仅导入所需的接口,而不是import * as express from 'express'包含express本身.
首先确保已安装express(npm install -D @types/express)的类型定义.
例:
// middleware/authCheck.ts
import { Request, Response, NextFunction } from 'express';
export const authCheckMiddleware = (req: Request, res: Response, next: NextFunction) => {
...
};
// server.ts
import { authCheckMiddleware } from './middleware/authCheck';
app.use('/api', authCheckMiddleware);
Run Code Online (Sandbox Code Playgroud)
目前使用TypeScript 2.3.4和@ types/express 4.0.36.
我有同样的问题,所以我想我会提供一个答案,万一其他人遇到这个问题.
| 归档时间: |
|
| 查看次数: |
2608 次 |
| 最近记录: |