我在javascript中有这个代码:
if (token) {
// verifies secret and checks exp
jwt.verify(token, Config.Secret, function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
想要将其重写为打字稿但却收到错误Property decoded does not exists on type Request
。
任何想法如何解决?
答案 0 :(得分:3)
您需要使用声明合并来为自定义Request
字段添加类型定义。为此,请创建一个如下所示的.d.ts
文件:
declare module Express {
export interface Request {
decoded: string;
// etc.
}
}
并将其添加到编译上下文中,以便编译器将类型定义与express.d.ts
中的类型定义合并。
答案 1 :(得分:3)
如果您不想扩展新类请求,您可以将请求作为对象访问:
req['decoded'] = decoded;
如果它仍然抛出你,你可能需要将req作为对象(打字稿):
(<Object>req)['decoded'] = decoded;
您甚至可以将req转换为输入any并将其解码为属性(typescript):
(<any>req).decoded = decoded;
答案 2 :(得分:0)
即使可能,我也不会合并具有相同名称的模块的接口。我宁愿创建一个新的自定义界面,您甚至可以在使用它的同一个文件中声明它。 (否则,只需将其导出)
import {Request, Response} from "express";
interface CustomRequest extends Request {
decoded: string;
}
这更清洁,而且更接近OOP。
答案 3 :(得分:0)
该错误意味着来自express的原始Request
类型不具有该名称的任何字段。
您有两个选项可以解决此问题,第一个问题是Vadim Macagon指出,您可以创建一个声明模块文件并添加自定义字段,这样就可以在每个请求中使用该字段。
declare module Express {
export interface Request {
decoded: string;
// etc.
}
}
选项二,您可以创建一个自定义界面,扩展原始请求并添加解码字段。
export default interface ICustomRequest extends Request {
token: string;
}
然后在你的代码中
app.post('/', function (req: ICustomRequest, res) {
req.decoded = decoded; // No errors here
});
第一个解决方案是将“自定义字段”“添加”到Request
,第二个解决方案是添加字段并从“请求”扩展。
在您的情况下,我会使用第一个解决方案,以避免每次必须使用请求中的decoded
字段时写入ICustomRequest(或您选择的任何名称),文件.d.ts
don'需要在您的代码中导入,这样您就可以创建文件并完成。
答案 4 :(得分:0)
我的'decoded'只是user_id字符串,我这样解决了这个问题:
req.body.decoded = decoded;
next();