代码之家  ›  专栏  ›  技术社区  ›  kentor

扩展classes对象的typedefinition

  •  1
  • kentor  · 技术社区  · 7 年前

    我正在使用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; typescript显然在对我大喊大叫,因为没有调用 user 在给定的请求对象上。我认为理想情况下,我可以简单地扩展类型的定义 Request 在restify名称空间中,以便它仍然可以使用相同的名称,但具有其他属性 user: {}; .

    我也可以创建一个新类型(如 RequestValidated ),但我当然希望它可用于整个库名称空间(无其他导入)。

    所以我的问题总结为一句话:

    如何扩展第三方库的定义以添加自定义更改(如附加到 要求 对象),以便它可用于相同的命名空间,而无需编辑原始键入文件(它们是定义类型的repo的一部分)?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    7 年前

    您可以在模块中重新声明模块和接口,并添加所需的字段。声明将合并到单个接口中。您可以将其放在一个单独的文件中,并将其包含在项目中,然后将其提取出来。

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