如何组合多个 TypeScript 类装饰器?

2024-03-19

我有一个类装饰器家族,我在很多类中重复使用它们。与此类似的东西:

@foo
@bar
@baz
export class MyClass { /* ..... */ }

由于我在多个类中使用这三个装饰器,我真的很想将其分解为一个装饰器,如下所示:

@standard
export class MyClass { /* ... */ }

我尝试创建一个新的类装饰器来链接装饰器调用,如下所示:

export function standard<ReturnType>(ctor: Constructor<ReturnType>) {
    return baz(bar(foo(ctor)));
}

TypeScript 手册说应用多个装饰器应该类似于函数组合进行评估,这就是为什么我认为我应该能够将它们链接在一起。但是,在编译时(使用 TypeScript 1.8)我收到类似于以下内容的错误

Unable to resolve signature of class decorator when called as an expression. Type 'Constructor<ReturnType>' is not assignable to type 'void'.

有没有办法构建这个“包装”装饰器来简化我的代码?


在尝试为@David 构建我的问题的更完整版本时,我找出了哪里出了问题。

一个更完整的例子:

interface Constructor<T> { new(...args: any[]): T }
interface A { a: number; }
interface B { b: number; }
interface C { c: number; }

function foo(Target: Constructor<A>): Constructor<A>{ 
    // do some stuff to the constructor
    return Target;
}
function bar(Target: Constructor<B>): Constructor<B> { 
    // do some stuff to the constructor
    return Target;
}
function baz(Target: Constructor<C>): Constructor<C> {
    // ....
    return Target;
}

function standard(ctor: Constructor<A & B & C>): Constructor<A & B & C> {
    return baz(bar(foo(ctor)));
}

@foo
@bar
@baz
class MyClass implements A, B, C { a=1;b=2;c=3;d=6; }

我的实际代码中存在一些隐式键入,这在某种程度上向我隐藏了问题。显然我无法正确读取编译器输出。

问题在于我如何声明我的装饰器:

function foo(Target: Constructor<A>): Constructor<A> { }

需要是

function foo<T extends A>(Target: Constructor<T>): Constructor<T> {}

我注意到如果我将装饰器中的返回类型设置为any编译错误消失了。额外的泛型参数让类型信息干净地流经装饰器。否则我相信它(基本上)看到了Constructor<MyClass>无法分配一个实例Constructor<A> (since A缺少其他接口)。另外奇怪的是,如果我添加了该声明,我会在装饰器中弹出更多错误d in MyClass.

所以最后 - 当使用类装饰器时,要小心你的泛型,或者只是返回any.

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

如何组合多个 TypeScript 类装饰器? 的相关文章

随机推荐

  • JComboBox 填充枚举变量值

    我有一个JComboBox我用这种方式制作的enum其价值观 JComboBox
  • migrate.exe 忽略绑定重定向

    我正在尝试运行migrate exe申请来自EntityFramework在特定的 DLL 上 该DLL引用了Microsoft Azure KeyVault WebKeynuget 包 当我尝试运行命令时 migrate MyProjec
  • 使用 .htaccess 动态 URL 重写

    我对 htaccess 重写还很陌生 我正在尝试创建规则来动态重写 URL 例如 假设用户输入以下 URL http example com xxx user 2002 它将被重写为 http example com xxx user 20
  • Solr - 如何获取特定格式的搜索结果

    在探索示例时索引维基百科数据 http wiki apache org solr DataImportHandler Example 3a Indexing wikipedia在Solr中 我们如何才能得到预期的结果 即与导入的数据相同 是
  • 斜杠有什么用? [复制]

    这个问题在这里已经有答案了 可能的重复 在 mysql real escape string 之后使用 stripslashes https stackoverflow com questions 11295141 using strips
  • 将我的 sql 查询转换为 crm 中的 queryexpression 或 fetchxml

    我有这个SQL查询我试图获取的位置opportunityId来自机会实体 为谁approvaldocument尚未创建 批准文档是其他实体的名称 我认为 fetchxml 不支持此类查询 我是 crm 新手 我的项目位于crm 4 0版本
  • 如何在 SwiftUI 中显示 HTML 文本

    我的要求是显示文本SwiftUI其中包含HTML标签 我尝试使用的方法WKWebKit Loadhtml效果很好 但是 我需要像这样显示它 人物卡集合 人员卡 姓名 职务 具有 HTML 文本的人员详细信息 例如Hello world 有人
  • 如何在 LIFERAY 中从first.jsp 重定向到second.jsp?

    这怎么办 请帮我解决这个问题 jsp 内部的重定向并不是真正方便的想法 因为下面的 jsp 解析进入渲染阶段 而该阶段的目的是显示内容 另一方面 下面重定向到操作阶段 在这里您可以决定 portlet 接下来应该做什么 阅读本教程以更好地理
  • 更新到 3.0 后 Gradle 构建失败

    我最近将项目的 gradle 版本从 2 14 1 更新到 3 0 从那时起 gradle 构建每次都会失败 并出现以下错误 错误 原因 org gradle api internal tasks DefaultTaskInputs Tas
  • 分组表视图

    我想创建一个如下图所示的表格视图 谁能告诉我一个例子或者说我该怎么做 创建一个 UITableView 并将样式设置为 UITableViewStyleGrouped 您可以通过编程方式或在 IB 中执行此操作 然后您需要 2 个部分 第一
  • 如何卸载Keras?

    我已经使用以下命令安装了 Keras sudo pip install keras 它安装正确并且工作正常 直到我尝试导入应用程序模块 from keras applications vgg16 import VGG16 Using The
  • 如何解决 Spark JDBC 的编码问题?

    我在 Oracle 中有一个表 其中有一些俄语记录 当我使用 Spark JDBC 读取此表时 我收到的数据帧的值不正确 您知道为什么会发生这种情况以及如何解决吗 executes given query using jdbc def ex
  • 将UserTrackingMode 设置为 MKUserTrackingModeFollow 而不更改缩放级别

    在 Apple 文档中设置用户跟踪模式 动画 https developer apple com library ios documentation MapKit Reference MKMapView Class index html a
  • 以 Kotlin 方式获取字符串中包含的子字符串的索引

    我想实现一个函数 它将返回指定字符串中子字符串的索引 现在我用Java风格做了 public fun String indexesOf substr String ignoreCase Boolean true List
  • 使用 SASS 函数自动设置嵌套元素的背景颜色

    我正在制作一个多级导航系统 并希望每个级别的背景颜色变暗 20 因此第 1 级 fff 第 2 级 ccc 第 3 级 999 等等 一定有一种很棒的方法可以使用 SASS 函数动态地自动化这个过程 但我不太明白如何设置该语句 有人能指出我
  • ActiveRecord 搜索返回“语法错误或访问冲突”错误

    在我的 Yii 应用程序中 我有一个模型代表siteconfig表并有四列 integer config id string key string value string update time 我使用Gii创建了一个模型 以确保我不会犯
  • 如何*快速*将许多 .txt 文件转换为 .xls 文件

    更新 我刚刚发现拥有更强大服务器的人将完成分配给我的任务 所以我没有让这个程序足够快也没关系 然而 下面的答案 自动化 Excel 有助于使程序速度提高三倍 因此我将其推荐给文件较少 但仍然较多 的人 我正在尝试将许多 超过 300 000
  • Java泛型通配符及其局限性

    我有一个由两部分组成的问题 我的书指出 如果指定通配符时没有大写字母 绑定 那么只能调用 Object 类型的方法 通配符类型的值 我不知道这意味着什么 这是什么意思 另外 通配符类型 无界和有界 有哪些限制 例如 如果我有一个参考MyCl
  • 来自相机的原始图像数据

    我一直在这个论坛上上下搜索 但找不到我真正需要的东西 我想从相机获取原始图像数据 到目前为止 我尝试通过该方法从 imageDataSampleBuffer 中获取数据captureStillImageAsynchronouslyFromC
  • 如何组合多个 TypeScript 类装饰器?

    我有一个类装饰器家族 我在很多类中重复使用它们 与此类似的东西 foo bar baz export class MyClass 由于我在多个类中使用这三个装饰器 我真的很想将其分解为一个装饰器 如下所示 standard export c