【发布时间】: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 声明,但属性装饰器必须返回 void 或 any 否则编译器错误。
【问题讨论】:
-
装饰器提供了什么样的功能?他们是否在数据库中编码/解码数据以及设置值?听起来,您将更容易引入一个接受泛型的抽象类,而不是像我之前所说的那样尝试使用装饰器来完成工作,编译器解释输出的输出非常麻烦装饰物业
-
装饰器在数据库中执行 api 调用转换和获取/设置值。使用这些装饰器,我能够将数据库记录公开为用户的 POJO(本质上为这些类的消费者提供 ActiveRecord 简单性)。继承层次结构在表示数据库方面已经令人不安。 :\
标签: typescript