首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在打字本中定义一个装潢工守卫

在打字本中定义一个装潢工守卫
EN

Stack Overflow用户
提问于 2017-03-20 12:45:27
回答 1查看 606关注 0票数 0

假设您有实现特定装饰器的类:

代码语言:javascript
复制
@Component
class A

@Component
class B

如果您希望有一个变量来保存其中一些类的类本身,那么它会有什么类型?

代码语言:javascript
复制
componentClass: typeof A | typeof B;

但是你可能已经在想:当你有很多类的时候,列举这些类并不是一个好的实践,当你不了解它们的时候,它甚至也不是一个选项。

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

代码语言:javascript
复制
componentClass: any;

但这也不好!

--我想为这个定义一个类型保护,所以我可以从一个可以检查对象是否有@组件装饰器的类型替换any类型,因此可以这样声明它:

代码语言:javascript
复制
componentClass: ComponentClass;

只是一个想法

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

代码语言:javascript
复制
@HasDecorator("Component")
type ComponentClass = any;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-20 12:57:32

如果您有不同的类表示Component,那么为什么不为它们都创建一个基类:

代码语言:javascript
复制
abstract class ComponentClass { ... }

@Component
class A extends ComponentClass { ... }

@Component
class B extends ComponentClass { ... }

然后,所有这些类都有一个类型,并且不需要类型混叠。

它对装饰师本身也很有用:

代码语言:javascript
复制
function Component(ctor: { new(): ComponentClass }) {}

甚至:

代码语言:javascript
复制
function Component<T extends ComponentClass>(ctor: { new(): T }) {}

编辑

当然,您也可以使用接口进行类似的操作:

代码语言:javascript
复制
interface ComponentClass { }

@Component
class A implements ComponentClass { }

@Component
class B implements ComponentClass { }

第二版

如果您想传递一个ComponentClass (A,或B等),那么您可以:

代码语言:javascript
复制
function fn(cls: typeof ComponentClass) { ... }

fn(A);

代码语言:javascript
复制
function fn<T extends ComponentClass>(cls: { new(): T }) { ... }

fn(B);

(操场密码

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42903987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档