0

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

@Component
class A

@Component
class B

如果你想要一个变量来保存其中一些类的类本身,它会有什么类型?

componentClass: typeof A | typeof B;

但是你是否已经在想:当你有很多类时枚举类不是一个好习惯,当你不知道它们时它甚至不是一个选择。

所以剩下的选项是(编辑:因为打字稿不允许 typeof 泛型)

componentClass: any;

但这也不好!


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

componentClass: ComponentClass;

只是一个想法

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

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

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

4

1 回答 1

3

如果您有代表 a 的不同类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 { }

第二次编辑

如果你想通过ComponentClass( A, or B, etc) 那么你可以这样做:

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

fn(A);

或者

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

fn(B);

操场上的代码

于 2017-03-20T12:57:32.587 回答