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

2024-01-13

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

我尝试了以下方法:

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

在 TypeScript Repl 中尝试 http://www.typescriptlang.org/play/index.html#src=class%20Component%20%7B%0A%20%20age%3A%20number%3B%0A%7D%0A%20%20%20%20%0Afunction%20registerComponent(name%3A%20string)%20%7B%0A%20%20return%20%3CT%20extends%20Component%3E(constructor%3A%20T)%3A%20T%20%3D%3E%20%7B%0A%20%20%20%20return%20constructor%20as%20T%3B%0A%20%20%7D%0A%7D%0A%0A%40registerComponent(%22demo%22)%0Aclass%20C1%20extends%20Component%20%7B%0A%0A%7D%0A


传递给装饰器的是类型,而不是类型的实例。话说constructor: T means 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 {

}

如果可以的话,您会因为包含打字稿副本而获得额外的+1。让检查我的答案变得非常容易。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在打字稿中输入类装饰器? 的相关文章

随机推荐