在使用egg.js + egg-passport + passport-local 的时候,遇到了函数参数类型不匹配的问题
- Dominant language
- TypeScript
- Stars
- 19k
- Forks
- 1.8k
- PR merge metrics
- No merged PRs in 30d
Description
## 最小可复现仓库
https://github.com/hythl0day/eggjs_passport_test
## 复现步骤,错误日志以及相关配置
(类型文件安装自:@types/passport-local)
打开app.js文件
内容完全复制自[官方示例代码](https://eggjs.org/zh-cn/tutorials/passport.html)但改写为typescript的方式。
然后在下面这个函数中遇到了类型错误的提示
```typescript
app.passport.use(new LocalStrategy({
passReqToCallback: true,
}, (req, username, password, done) => {
// format user
const user = {
provider: 'local',
username,
password,
};
// debug('%s %s get user: %j', req.method, req.url, user);
app.passport.doVerify(req, user, done);
}));
```
在:doVerify(req, user, done),这一行中,req的参数不匹配。
编辑器提示:
```
Argument of type 'Request' is not assignable to parameter of type 'Request'.
Type 'Request' is missing the following properties from type 'Request': files, acceptJSON, queries, req, and 14 more.ts(2345)
```
而且这个错误无法忽略,执行 npm run dev会被中断。
按照 @types/passport-local的定义,LocalStrategy的构造函数如下:
```typescript
declare class Strategy extends PassportStrategy {
constructor(
options: IStrategyOptionsWithRequest,
verify: VerifyFunctionWithRequest
);
// ...
name: string;
}
```
其中VerifyFunctionWithRequest的定义如下:
```typescript
interface VerifyFunctionWithRequest {
(
req: express.Request,
username: string,
password: string,
done: (error: any, user?: any, options?: IVerifyOptions) => void
): void;
}
```
可以看到这里的req类型是 express.Request,在@types/express中的定义是:
```typescript
interface Request
extends core.Request { }
```
而doVerify是来自 egg-passport的type定义:
```typescript
doVerify(req: Request, user: TUserPayload, done: (err: any, user?: TUser) => void): void;
```
这里的req的类型来自eggjs自己的egg-multipart文件
```typescript
interface Request {
/**
* Files Object Array
*/
files: EggFile[];
}
```
要怎么解决这两个req类型不同导致无法在typescript中使用的问题?
## 相关环境信息
- **Node 版本**:v14.15.0
- **Egg 版本**:2.6.1
Contributor guide
Assessment
This issue has not been assessed yet.