我很抱歉我的英语水平很差。
我使用特快专递打字稿创建了一个新项目。
$ npx速递机-打字本-用途-纱线
我想为我的自定义中间件向Express.Request
添加其他属性。因此,我在types/myRequest.d.ts
中创建了./src
,并将代码放入并保存如下:
// myRequest.d.ts
declare namespace Express {
interface Request {
myProp?: boolean;
}
}
我取消了tsconfig.json
中的“tsconfig.json
”注释,添加了“./node_node/@type”、“./src/tsconfig.json
”,并尝试通过在./src/routes/api.ts
中创建一些中间件来使用添加的属性。下面是完整的代码:
// api.ts
import { NextFunction, Request, Response, Router } from "express";
import userRouter from "./user-router";
function myMiddleware(req: Request, _res: Response, next: NextFunction) {
req.myProp = true;
next();
}
// Export the base-router
const baseRouter = Router();
// Setup routers
baseRouter.use("/users", myMiddleware, userRouter);
// Export default.
export default baseRouter;
这构建得很好,VS代码中的IntelliSense也很好,不显示任何问题。但是,当我运行yarn start:dev
时,我会得到以下错误:
/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:828
return new TSError(diagnosticText, diagnosticCodes);
^
TSError: ⨯ Unable to compile TypeScript:
src/routes/api.ts:5:7 - error TS2339: Property 'myProp' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.
5 req.myProp = true;
~~~~~~
at createTSError (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:828:12)
at reportTSError (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:832:19)
at getOutput (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1022:36)
at Object.compile (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1326:43)
at Module.m._compile (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1458:30)
at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Object.require.extensions.<computed> [as .ts] (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1462:12)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19) {
diagnosticCodes: [ 2339 ]
}
[nodemon] app crashed - waiting for file changes before starting...
所以我不能在开发状态下进行开发。当然,如果我不使用其他属性,那么dev状态也是可用的,并且工作正常。
我认为express-generator-typescript
本身就有一些背景。因为在tsconfig.json
中更改"typeRoots“并不会改变结果。但我找不到。
提前谢谢你。
发布于 2022-02-15 12:07:59
每当遇到这种类型的问题时,我通常使用“声明模块”向Express的“请求”接口添加属性,而不是在命名空间中声明它们。这样,我通常不需要更改tsconfig中的任何内容,也不必添加任何.d.ts文件。
将这些行添加到您的api.ts代码中(注意,在大多数情况下,您需要引用快递服务静态核心模块,因为请求接口就是在这里声明的):
declare module "express-serve-static-core" {
interface Request {
myProp?: boolean;
}
}
完整档案:
// api.ts
import { NextFunction, Request, Response, Router } from "express";
import userRouter from "./user-router";
declare module "express-serve-static-core" {
interface Request {
myProp?: boolean;
}
}
function myMiddleware(req: Request, _res: Response, next: NextFunction) {
req.myProp = true;
next();
}
// Export the base-router
const baseRouter = Router();
// Setup routers
baseRouter.use("/users", myMiddleware, userRouter);
// Export default.
export default baseRouter;
通常,这将使新添加的属性在其他文件中也可用,但您当然可以导出经过操作的请求接口,这样才是安全的。
发布于 2022-02-15 11:05:50
我建议你一条路,希望它能帮你。
在文件./src/ file /api.ts中添加以下代码(在导入下)
declare global {
namespace Express {
interface Request {
myProp?: boolean;
}
}
}
然后再运行(似乎不需要types/myRequest.d.ts
文件)
https://stackoverflow.com/questions/71122741
复制相似问题