在打字稿中定义一个装饰守卫
Define a decorator guard in typescript
假设您有 class 实现特定装饰器的元素:
@Component
class A
@Component
class B
如果你想要一个变量来保存其中一些 class 本身的 class,它应该是什么类型?
componentClass: typeof A | typeof B;
但是您是否已经在想:当您有很多 class 时,列举这些并不是一个好的做法,当您不了解它们时甚至不是一个选择。
所以剩下的选项是 (编辑:因为 typescript 不允许 typeof 泛型):
componentClass: any;
但这也不好!
我想为此定义一个类型保护,这样我就可以用可以实际检查对象是否具有 @Component 装饰器的类型替换 any
类型,所以它可以这样声明:
componentClass: ComponentClass;
只是一个想法
我认为最好的方法是为它定义一个类型,并在其中定义守卫。 但是这是不可能的.
@HasDecorator("Component")
type ComponentClass = any;
希望看到您解决这个问题的想法。谢谢!
如果您有不同的 class 表示 Component
,那么您为什么不为它们都创建一个基础 class:
abstract class ComponentClass { ... }
@Component
class A extends ComponentClass { ... }
@Component
class B extends ComponentClass { ... }
然后你就有了所有这些 classes 的类型,不需要类型别名。
它对装饰器本身也很有用:
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
,或B
等),那么你可以这样做:
function fn(cls: typeof ComponentClass) { ... }
fn(A);
或
function fn<T extends ComponentClass>(cls: { new(): T }) { ... }
fn(B);
假设您有 class 实现特定装饰器的元素:
@Component
class A
@Component
class B
如果你想要一个变量来保存其中一些 class 本身的 class,它应该是什么类型?
componentClass: typeof A | typeof B;
但是您是否已经在想:当您有很多 class 时,列举这些并不是一个好的做法,当您不了解它们时甚至不是一个选择。
所以剩下的选项是 (编辑:因为 typescript 不允许 typeof 泛型):
componentClass: any;
但这也不好!
我想为此定义一个类型保护,这样我就可以用可以实际检查对象是否具有 @Component 装饰器的类型替换 any
类型,所以它可以这样声明:
componentClass: ComponentClass;
只是一个想法
我认为最好的方法是为它定义一个类型,并在其中定义守卫。 但是这是不可能的.
@HasDecorator("Component")
type ComponentClass = any;
希望看到您解决这个问题的想法。谢谢!
如果您有不同的 class 表示 Component
,那么您为什么不为它们都创建一个基础 class:
abstract class ComponentClass { ... }
@Component
class A extends ComponentClass { ... }
@Component
class B extends ComponentClass { ... }
然后你就有了所有这些 classes 的类型,不需要类型别名。
它对装饰器本身也很有用:
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
,或B
等),那么你可以这样做:
function fn(cls: typeof ComponentClass) { ... }
fn(A);
或
function fn<T extends ComponentClass>(cls: { new(): T }) { ... }
fn(B);