扩展 类 对象的类型定义
Extend typedefinition of a classes object
我正在使用 Restify(如果您不知道 Restify,请将其视为 Express.js)并且我想将一个对象附加到请求对象,以便我可以在以下路径中访问它.
更具体的例子:
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
对象的自定义 属性),以便它无需编辑即可用于相同的命名空间原始类型文件(它们是定义类型的 repo 的一部分)?
您可以在模块中重新声明模块和接口,并添加您需要的字段。这些声明将合并到一个接口中。你可以把它放在一个单独的文件中并将它包含在你的项目中,它会被拾取。
// 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 = ";";
我正在使用 Restify(如果您不知道 Restify,请将其视为 Express.js)并且我想将一个对象附加到请求对象,以便我可以在以下路径中访问它.
更具体的例子:
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
对象的自定义 属性),以便它无需编辑即可用于相同的命名空间原始类型文件(它们是定义类型的 repo 的一部分)?
您可以在模块中重新声明模块和接口,并添加您需要的字段。这些声明将合并到一个接口中。你可以把它放在一个单独的文件中并将它包含在你的项目中,它会被拾取。
// 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 = ";";