【问题标题】:How to get parameters name within decorators如何在装饰器中获取参数名称
【发布时间】:2018-03-18 21:22:48
【问题描述】:

我正在尝试开发一个装饰器来了解某些参数是否有效。

这是我的方法,

getUsers(offset, limit, orderBy, sort){
....
}

我需要检查 orderBy 是 'createdAt' 还是 'updatedAt' 如果不是,将发送一个 http 响应。

排序也一样,它需要是“ASC”或“DESC”。

所以,我不知道如何使用装饰器来帮助我删除代码中的某些行,这是一个小块,但我认为它更干净。目前这是我要检查的块

if (!includes(this.orderByFields, orderBy)) {
  return Utils.HttpError.badRequest(`You are allowed to order by [ ${this.orderByFields.join(', ')} ] only.`);
}

也许无法做到,在此先感谢 :-)

【问题讨论】:

标签: javascript typescript decorator


【解决方案1】:

你应该可以做这样的事情:

type ApiFunction = (offset: number, limit: number, orderBy: string, sort: string) => any;

const orderByFields = ["createdAt", "updatedAt"];
function validateRequest() {
  return function(_target: any, _propertyName: string, descriptor: TypedPropertyDescriptor<ApiFunction>) {
    const originalMethod = descriptor.value!;
    descriptor.value = function(offset, limit, orderBy, sort) {
      if (!orderByFields.includes(orderBy)) {
        return "Bad Request";
      }
      return originalMethod.bind(this)(offset, limit, orderBy, sort);
    };
  };
}

这也确保您只能将装饰器应用于具有匹配签名的方法。

使用示例:

class Foo {
  @validateRequest()
  getUsers(offset: number, limit: number, orderBy: string, sort: string): string {
    return "Result";
  }
}

除此之外,您可能还想尝试在类型级别上强制执行 orderBysort 参数(如果您是此 API 的唯一使用者,那么您甚至可能不需要装饰器):

function getUsers(offset: number, limit: number, orderBy: "createdAt" | "updatedAt", sort: "ASC" | "DESC") {}

【讨论】:

  • 嗨 Gustorn,谢谢,我会试试这个,但你知道是否有可能有一个名为 param 和 value 的 Json 吗?像 { number: 10, orderBy: 'createdAt', ... } 但不是使用对象作为参数?谢谢
  • 不,如果你想要类型检查的参数,那么你应该使用一个对象。从技术上讲,您可以在函数内部传递一个字符串和 JSON.parse(...),但这非常难看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2018-01-21
  • 2016-10-10
相关资源
最近更新 更多