【发布时间】:2018-04-15 10:33:32
【问题描述】:
我在设计与类和接口的各种关系时遇到了一些问题,因为 TypeScript 不允许像 C# 那样进行某些类型转换。
我当前的层次结构如下:
interface IComponent {}
interface IBehaviour1 {}
interface IBehaviour2 {}
class Component implements IComponent, IBehaviour1 {}
class SpecializedComponent extends Component implements IBehaviour2 {}
在另一个类中,我存储了一个Set<IComponent> 集合,我在其中注册了多个Component 和SpecializedComponent 对象。但是,在一个函数中,我需要遍历所有这些函数并调用 IBehaviour1 特定方法(如果存在)和 IBehaviour2 特定方法(如果存在)。
由于我经常调用此方法,因此我决定创建以设置 Set<IBehaviour1> 和 Set<IBehaviour2> - 每次调用 addComponent 时,我都会对新组件进行适当的分类。
在 C# 中,这看起来像这样:
void AddComponent(IComponent component)
{
if (component is IBehaviour1)
behaviour1Components.Add((IBehaviour1)component);
if (component is IBehaviour2)
behaviour2Components.Add((IBehaviour2)component);
}
不幸的是,TypeScript 不允许如上所示的特定类型检查/比较,因为 IBehaviour1 和 IBehaviour2 与 IComponent 不兼容。此外,两组并不相交。我很好奇应该如何存储所有组件,以便可以调用所有行为方法(如果存在)。
【问题讨论】:
-
还没有尝试过任何东西,但是您是否尝试使用像
void Add component<T extends IComponent>(component: T)这样的通用设置来代替?