在TypeScript中,我定义了一个装饰器
function Foo(type: AnEnum) {
return <T extends { pattern: RegExp, new(...args: any[]): {} }>(constructor: T) => {
RegisterPattern(pattern) // defined elsewhere
return class extends constructor {
public type: AnEnum = type
}
}
}
并将其用作
@Token(AnEnum.Bar)
class Bar {
public static pattern = /./
public test: number
constructor() {
this.test = 1
}
}
我希望只有用@Foo
修饰的类传递给像
function func(decoratedObject: DecoratedType) {
/* something */
}
和TypeScript应该识别出添加了一个名为type
的附加字段。可能吗?或者这是一个糟糕的设计模式?
答案 0 :(得分:2)
TypeScript目前不支持通过装饰器进行建模类型变异。
此功能已被请求,并在TypeScript/issues/4881
中进行了广泛讨论要获得所需的效果,必须将装饰器作为函数调用并捕获结果值。
对于装饰者来说,这意味着写作:
const decorated = decorator(class {});
对于装饰工厂,这意味着写作:
const decorated = decorator(configuration)(class {});