【问题标题】:Can a property decorator define the type of the decorator property?属性装饰器可以定义装饰器属性的类型吗?
【发布时间】:2018-04-06 13:49:22
【问题描述】:

我有一个返回属性描述符的属性装饰器。有没有办法通过装饰器告诉编译器被装饰属性 x 的类型?

例如

// returns a readonly string property descriptor
function d(target, key) {
    return {
        get: function() : string {return 'hello'}
    }
}

// would like type of property x to be `string` either inferred
// or taken from decorator getter signature
class A {
    @d()
    x 
}

我要解决的问题是消除装饰器用户的额外工作 - 我的装饰器定义属性(包括类型),因此重复类型(在本例中为 x: string)是多余的。现实世界的例子是所有属性(数百个)都被修饰的数据库类。目前每个属性都有装饰器和一个特定的类型注释。当我启用--strictNullChecks 时出现了痛点,这意味着数百个属性需要将| null 添加到类型中(因为数据库允许将null 设置为值)。由于装饰器规定了属性类型,我希望删除类型声明。

我看到 TS 包含一个通用的 TypedPropertyDescriptor 声明,但属性装饰器必须返回 voidany 否则编译器错误。

【问题讨论】:

  • 装饰器提供了什么样的功能?他们是否在数据库中编码/解码数据以及设置值?听起来,您将更容易引入一个接受泛型的抽象类,而不是像我之前所说的那样尝试使用装饰器来完成工作,编译器解释输出的输出非常麻烦装饰物业
  • 装饰器在数据库中执行 api 调用转换和获取/设置值。使用这些装饰器,我能够将数据库记录公开为用户的 POJO(本质上为这些类的消费者提供 ActiveRecord 简单性)。继承层次结构在表示数据库方面已经令人不安。 :\

标签: typescript


【解决方案1】:

不幸的是,我认为您当前的尝试在当前版本的 Typescript 中是不可能的。您试图通过装饰器隐式设置属性 x 的类型来修改类 A 的签名,编译器无法知道 x 应该是什么类型,编译器也无法知道x 应该有get 方法。

GitHub 上有一个关于类装饰器非常相似的问题的大线程。 https://github.com/Microsoft/TypeScript/issues/4881 有兴趣的可以关注这个帖子!

您可以以不同的方式处理此问题,并为A 类提供一个带有约束的泛型;但是,我不确定您要解决什么问题,所以这可能不是一个选择。

【讨论】:

    猜你喜欢
    • 2015-10-23
    • 2020-06-20
    • 2018-12-03
    • 2019-07-29
    • 2013-08-19
    • 1970-01-01
    • 2018-07-20
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多