属性装饰器可以定义装饰器属性的类型吗?

时间:2018-04-06 13:49:23

标签: typescript

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

e.g。

// 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其他编译器错误。

1 个答案:

答案 0 :(得分:0)

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

GitHub上有一个关于类装饰器非常类似问题的大线程。 https://github.com/Microsoft/TypeScript/issues/4881如果您有兴趣,也许可以关注该主题!

您可以采用不同的方法,并为A类提供具有约束的泛型;但是,我不确定你要解决的问题是什么,这可能不是一个选择。