这个问题已经有几次被问到了,但是没有一个给出的答案对我有效。我正在尝试扩展Express Request
对象,以包括一个属性来存储一个User
对象。我创建了一个声明文件 express.d.ts
,并将其放置在与我的 tsconfig.json
相同的目录中:
import { User } from "./src/models/user";
declare namespace Express {
export interface Request {
user: User;
}
}
然后我尝试在 secured-api.ts
中对其进行赋值:
import express from 'express';
import { userService } from '../services/user';
router.use(async (req, res, next) => {
try {
const user = await userService.findByUsername(payload.username);
// do stuff to user...
req.user = user;
next();
} catch(err) {
// handle error
}
});
我遇到了如下错误:
src/routes/secured-api.ts:38:21 - error TS2339: Property 'user' does not exist on type 'Request'.
38 req.user = user;
~~~~
我的User
类是:
import { Model, RelationMappings } from 'objection';
export class User extends Model {
public static tableName = 'User';
public static idColumn = 'username';
public static jsonSchema = {
type: 'object',
required: ['fname', 'lname', 'username', 'email', 'password'],
properties: {
fname: { type: 'string', minLength: 1, maxLength: 30 },
lname: { type: 'string', minLength: 1, maxLength: 30 },
username: { type: 'string', minLength: 1, maxLength: 20 },
email: { type: 'string', minLength: 1, maxLength: 320 },
password: { type: 'string', minLength: 1, maxLength: 128 },
}
};
public static modelPaths = [__dirname];
public static relationMappings: RelationMappings = {
};
public fname!: string;
public lname!: string;
public username!: string;
public email!: string;
public password!: string;
}
我的tsconfig.json
文件是:
{
"compilerOptions": {
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"lib": ["es2015"], /* Specify library files to be included in the compilation. */
"outDir": "./build", /* Redirect output structure to the directory. */
"strict": true, /* Enable all strict type-checking options. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
}
}
我的目录结构是:
backend/
package.json
tsconfig.json
express.d.ts
src/
models/
user.ts
routes/
secured-api.ts
我在这里做错了什么?
namespace Express
对我似乎不起作用。我不得不使用declare module 'express'
代替。你知道为什么会出现这种情况吗? - DollarAkshayexpress/
目录下的index.d.ts
文件后,declare namespace Express
的解决方案得以实现。 - gtmsinghtypescript-eslint/no-namespace
警告,根据 eslint 推荐的设置。我会将其禁用,个人而言我不介意使用命名空间,但奇怪的是这在 eslint 推荐中被严重反对。 - JHH