扩展类对象

时间:2017-12-13 03:36:46

标签: typescript typescript-typings

我正在使用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的一部分)?

1 个答案:

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