我正在使用Restify(如果你不了解Restify,请将其视为Express.js)并且我想将一个对象附加到请求对象,以便我可以在以下路径中访问它。 / p>
更具体的例子:
export const validate: ValidateFn = async (req: Request, res: Response, next: Next): Promise<void> => {
// Validate and parse token from headers
const authHeader: string = req.header('authorization', null);
const parsedToken: string = parseBearerToken(authHeader);
if (parsedToken == null) { return next(new errors.InvalidCredentialsError('Missing authorization')); }
// Verify token
try {
const data: {} = jwt.verify(parsedToken, config.apiServer.jwtSecret);
req.user = data;
} catch (err) {
return next(new errors.NotAuthorizedError('Invalid authentication'));
}
return next();
};
在这一行中req.user = data;
打字稿显然对我大吼大叫,因为在给定的Request对象上没有名为user
的字段。我认为理想情况下我可以简单地在restify名称空间中扩展类型Request
的定义,以便它仍然可以使用相同的名称但具有附加属性user: {};
。
我也可以创建一个新类型(如RequestValidated
),但我当然希望它可用于整个库命名空间(没有其他导入)。
所以我的问题用一句话概括:
如何扩展第三方库的定义以添加我的自定义更改(如附加到Request
对象的自定义属性),以便它可用于相同的命名空间而无需编辑原始文件键入文件(属于definetely类型的repo的一部分)?
答案 0 :(得分:2)
您可以使用模块重新声明模块和接口,并添加所需的字段。声明将合并到一个接口中。你可以将它放在一个单独的文件中并将其包含在你的项目中,然后它就会被选中。
// restify.extra.d.ts
import { Request } from 'restify'
declare module 'restify' {
interface Request {
user: any
}
}
// Other file:
import { Request } from 'restify'
let r: Request;
r.accepts("");
r.user = ";";