typescript - TypeScript:如何在内部属性上使用 Reflect.metadata?
问题描述
这是我想做的事情:
class MyClass {
@Reflect.metadata("desc", "My outer property") // OK
outerProp: {
@Reflect.metadata("desc", "My inner property") // Error
innerProp: string;
};
}
错误是“需要 [ts] 属性或签名”。
为什么装饰器对 outerProp 有效,而对 innerProp 无效?有没有办法在不将 outerProp 的类型重构为命名类的情况下做到这一点?
解决方案
反射注释只能附加到类和类成员,如文档中所述:
装饰器通过声明性语法添加了在定义类时扩充类及其成员的能力
将第一个注解添加到 的outerProp
属性中MyClass
,就可以了:
@Reflect.metadata("desc", "My outer property") // OK
outerProp: {
但是第二个注释被添加到 typescript 接口的属性,而不是类。此类型定义不会在运行时出现,因为它只是 typescript 编译器的提示,这意味着您不能向其添加注释:
@Reflect.metadata("desc", "My inner property") // Error
innerProp: string;
要解决该错误,您必须重构outerProp
为命名类 - 无法解决此问题,因为注释只能添加到已编译的 javascript 中仍然存在的内容中:
@Reflect.metadata("desc", "My outer property")
class OuterPropType {
@Reflect.metadata("desc", "My inner property")
innerProp: string;
}
class MyClass {
outerProp: OuterPropType;
}