编写只接受特定类的类装饰器的正确方法是什么?
我尝试了以下内容:
class Component {
age: number;
}
function registerComponent(name: string) {
return <T extends Component>(constructor: T): T => {
return constructor as T;
}
}
@registerComponent("demo")
class C1 extends Component {
}
结果是:
Argument of type 'typeof C1' is not assignable to parameter of type 'Component'.
Property 'age' is missing in type 'typeof C1'.
答案 0 :(得分:5)
传递给装饰器的是类型,而不是类型的实例。假设constructor
表示T
必须是T
类型的实例,因此您必须告诉它参数和结果都是类型class Component {
age: number;
}
function registerComponent(name: string) {
return <T extends Component>(constructor: new () => T): new () => T => {
return constructor;
}
}
@registerComponent("demo")
class C1 extends Component {
}
的构造函数:< / p>
{{1}}
如果可以的话,你会得到额外的+1包括打字稿repl。让我很容易检查我的答案。
请注意,您可能还需要指定构造函数参数。