在打字稿中定义一个装饰者守卫

时间:2017-03-20 12:45:28

标签: typescript reflect-metadata

想象一下,你有实现某个装饰器的类:

@Component
class A

@Component
class B

如果你想拥有一个包含某些类的类本身的变量,它会有什么类型?

componentClass: typeof A | typeof B;

但是你有没有想过:当你拥有很多课程时,列举这些课程并不是一个好习惯,而且当你不了解这些课程时,它甚至都不是一个选择。

所以剩下的选项是(编辑:因为typescript不允许使用类型的泛型)

componentClass: any;

但这也不好!

我想为此定义一个类型保护,所以我可以将any类型替换为可以实际检查该对象是否具有@Component装饰器的类型,因此它可以是声明如下:

componentClass: ComponentClass;

只是一个想法

我认为最好的方法是为它定义一个类型,并在那里定义守卫。 但这不可能

@HasDecorator("Component")
type ComponentClass = any;

希望看到你的想法来解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:3)

如果您有不同的类代表Component,那么为什么不为它们提供基类:

abstract class ComponentClass { ... }

@Component
class A extends ComponentClass { ... }

@Component
class B extends ComponentClass { ... }

然后你有一个所有这些类的类型,不需要类型别名 它对装饰器本身也很有用:

function Component(ctor: { new(): ComponentClass }) {}

甚至:

function Component<T extends ComponentClass>(ctor: { new(): T }) {}

修改

当然,您也可以使用界面执行类似的操作:

interface ComponentClass { }

@Component
class A implements ComponentClass { }

@Component
class B implements ComponentClass { }

第二次编辑

如果您想传递ComponentClassAB等),您可以这样做:

function fn(cls: typeof ComponentClass) { ... }

fn(A);

或者

function fn<T extends ComponentClass>(cls: { new(): T }) { ... }

fn(B);

code in playground