我有一个属性装饰器,它返回一个属性描述符。有没有办法通过装饰器告诉编译器装饰属性的类型 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
声明,但是属性修饰符必须返回void
或any
其他编译器错误。
答案 0 :(得分:0)
不幸的是,我不认为当前版本的Typescript目前可以尝试的是什么。你试图通过装饰器隐式设置属性x的类型来修改类A
的签名,编译器无法知道x应该是什么类型,编译器也没办法知道x应该有get
方法。
GitHub上有一个关于类装饰器非常类似问题的大线程。 https://github.com/Microsoft/TypeScript/issues/4881如果您有兴趣,也许可以关注该主题!
您可以采用不同的方法,并为A
类提供具有约束的泛型;但是,我不确定你要解决的问题是什么,这可能不是一个选择。