如何在 TypeScript 中向装饰器添加可选参数?

2024-03-15

我想创建一个可以选择接受参数的字段装饰器。 该参数应包含以下任意值:无、布尔值或函数。 我知道如何做到这一点,但我对结果并不是 100% 满意:

export class TestClass{

   @Required(isRequired) 
   public testField: string;

}

export function isRequired():boolean{
   ... some validation logic, maybe depending on other fields...
   return result;
}

@Required 的实现:

export function Required(expression?: boolean|Function): Function {
    return (target: any, key: string) => {
        if (expression === null || typeof expression == 'undefined') {
            expression = true;
        }
        console.log("Required found: " + expression, ":", target, key);
        ... register the field and its validation expression for later usage
    }
}

所以这工作正常,但是当我不想添加表达式(因此使用默认的“true”表达式)时,我希望能够像这样编写它:

class TestClass{

   @Required
   public testField: string;

}

我收到 TypeScript 错误 (TS1240),内容如下:

作为属性调用时无法解析属性装饰器的签名 表达。提供的参数与调用的任何签名都不匹配 目标

所以我需要写@Required()

class TestClass{

   @Required()
   public testField: string;

}

是否可以编写一个装饰器实现,它可以选择接受一个参数,并且当未指定该参数时,不需要添加“()”?


事实上,这是可能的。

这是一个工作示例:

export type Target = {
  new (...args: any[]): any,
  name: string
};

export function Component(target: Target): void;
export function Component(name: string): (target: Target) => void;
export function Component(nameOrTarget: string | Target) {
  if (typeof nameOrTarget !== 'string') {
    console.log(nameOrTarget.name, ' is now decorated');
  } else {
    return function (target: Target) {
      const name = nameOrTarget || target.name;
      console.log(name, ' is now decorated');
    };
  }
}

@Component
export class MyDatabase { }

@Component('Hello Db')
export class MyHelloDatabase { }

最重要的部分是以下两行:

export function Component(target: Target): void;
export function Component(name: string): (target: Target) => void;

如果有人正在寻找更多信息,请查看此GitHub问题 https://github.com/Microsoft/TypeScript/issues/13173.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 TypeScript 中向装饰器添加可选参数? 的相关文章

随机推荐

  • Python将字符串转换为变量名

    我知道这可能会出现重复 但到目前为止我还没有找到 或者应该理解 我正在寻找的答案 我有一个字符串列表 想要将每个字符串转换为一个变量名 然后为其分配一些内容 我知道我可能需要一个字典 但我对它们不熟悉 因为我对 python 相对较新 并且
  • Android wifimanager总是返回true

    这简直要了我的命 任何帮助将不胜感激 我想使用 wifi 管理器连接到开放网络 我遇到的问题是该代码声称连接到任何网络 甚至是不存在的网络 下面是执行并使用网络 SSID 调用的完整代码 无论您传递给它什么字符串作为网络的 SSID 即使不
  • 是否可以释放静态定义的数组?

    您可以释放使用静态分配定义的数组的内存吗 不 这是不可能的取消分配静态分配的内存 根据语言 例如 C C 使用指针 您也许可以将此数组所持有的内存用于其他目的 但这样做只会re use记忆 内存不会被释放per se 也就是说 将静态内存与
  • 调用基类构造函数而不命名其类

    class MyDerived public Incredble
  • iphone dev - NSUserDefaults 检查布尔值是否存在

    我刚刚向我的应用程序添加了一个设置包 但在读取布尔设置时遇到问题 我知道 在启动应用程序时 除非用户实际输入设置 否则不会读取设置 这就是我想要捕获的内容 但是 我的代码只是捕获答案是否为 否 或尚未设置的情况 我需要查明它们是否已设置 然
  • 如何去除 iPhone 中的阴影

    我正在使用以编程方式从按钮制作阴影的标准方法 但我希望在完成按钮后阴影不再存在 我可以将不透明度设置为 0 但阴影是否仍然存在 如果存在 仍然会对系统造成负担 谢谢 这给出了一个错误 tempButton superview layer s
  • HTML 电子邮件模板是否需要使用 style 属性?

    是否存在需要 出于某种原因 将 CSS 规则放置在style直接使用 HTML 标签的属性 而不是将 CSS 规则放置在 HTML 电子邮件模板 HEAD 的 STYLE 元素中的选择器内 我要求最常见的 CSS 选择器 如类型 类 ID
  • php 爆炸并强制数组键从 1 而不是 0 开始

    我有一个字符串 它将被分解以获得一个数组 正如我们所知 输出数组键将从 0 开始作为第一个元素的键 1 为第二个元素 依此类推 现在如何强制该数组从 1 而不是 0 开始 对于类型化数组来说非常简单 我们可以这样写 array 1 gt v
  • 如何从标准输入构建 tar?

    我怎样才能将信息输入tar指定文件名 就像是 tar cfz foo tgz files from 但请记住 这并不适用于所有可能的文件名 你应该考虑 null选项和饲料tar from find print0 The xargs示例对于大
  • 这种模式似乎很详尽,但我仍然收到警告

    我正在学习 sml 并编写了以下简单函数 Return a list with every other element of the input list fun everyOther everyOther x x everyOther x
  • 使用键绑定在 VSCode 中执行预定义的查找替换全部

    我似乎找不到可以从 VSCode 键绑定运行的记录命令的良好列表 在在线 VSCode 文档中 命令指南 https code visualstudio com api extension guides command列出了两种发现命令的方
  • 具有下一个和上一个功能的一张一张显示图像

    我已将图像存储在单独的文件夹 图像 中 并创建了一个存储 letterNumber 的数据库 并且每个 letterNumber 都关联了多个图像 表 animages 如下 letterNo imageNo path height wid
  • Rails 4 find_by 是否已弃用?

    我听说 find by 已被弃用 这是真的吗 我一直在考虑替代方案 例如为每个人创建find另一种方法 例如 before Model find by username username 后 模型中 class lt lt self def
  • 我可以使用异步函数进行无限递归而不产生堆栈溢出吗

    我有一个异步函数 我想调用它等待用户操作并在一些处理后解析 async function waitOnUserInput 我想等待用户输入进行一些处理并重复 所以 我想像这样递归地实现这个 async function actionUser
  • 模态呈现的视图控制器的透明背景

    我正在使用 Parse 和 ParseUI 我希望我的 PFLoginViewController 子类具有透明背景 将来 我想在背景上放置一个模糊的视图 但是 一旦 PFMLogin ViewController 的动画输入完成 背景就会
  • 电子表格函数根据另一列的条件对一列中的所有值求和

    我想要一个电子表格函数 当 A 列等于时 它将生成 B 列中所有值的总和X当它等于Y A B X 10 Y 3 X 7 X 22 Y 4 Y 9 输出应如下所示 其中39 and 16是公式的结果 X 39 gt 10 7 22 Y 16
  • 如何在 Spring 中创建默认的可重写组件?

    我正在尝试创建一个Component那将是Autowired除非用户创建不同的实现 我使用以下代码来尝试隔离问题 界面 public interface A 实施 Component ConditionalOnMissingBean A c
  • 当声明这样的指针时,“pointer[restrict static 1]”会带来什么优化好处?

    我正在阅读库 QNNPack 的源代码并注意到这一行 https github com pytorch QNNPACK blob 24d57f21503ba8ab0f8bb5d24148754a91266b9c src q8gemm 6x4
  • 用于匹配 C# 字符串文字的正则表达式

    我正在尝试写一个正则表达式 http en wikipedia org wiki Regular expression它将匹配包含以下形式的名称 值对的字符串
  • 如何在 TypeScript 中向装饰器添加可选参数?

    我想创建一个可以选择接受参数的字段装饰器 该参数应包含以下任意值 无 布尔值或函数 我知道如何做到这一点 但我对结果并不是 100 满意 export class TestClass Required isRequired public t