如何在打字稿中键入类装饰器?

时间:2017-07-18 07:33:52

标签: typescript

编写只接受特定类的类装饰器的正确方法是什么?

我尝试了以下内容:

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'.

Try in TypeScript Repl

1 个答案:

答案 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。让我很容易检查我的答案。

请注意,您可能还需要指定构造函数参数。