扩展 类 对象的类型定义

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 = ";";