对类使用泛型类型

时间:2019-03-05 00:58:15

标签: javascript class flowtype generic-type-argument

我正在使用Flow,并具有通用类型的用例,但不知道如何使用它们。

我有一个类,它接受一种类型的事件数组。所有事件类型都共享某些属性(例如startTime),而其他属性则有所不同。类函数的返回值应该与构造函数数组中传递的事件具有相同的类型。

为了更具体一点,在下面的代码中,我想说明一下:如果您创建带有数组EventUtility的{​​{1}}实例,那么当您要求{{1} },您可以肯定会得到PartyEvent的回报。 (传递给构造函数的数组不能包含不同类型的对象的混合物。)

谢谢。

EventUtility.earliestEvent()

1 个答案:

答案 0 :(得分:1)

您要寻找的是有界的泛型。在Flow文档here中对其进行了解释。

首先,使整个类在某种类型的T上通用,而不仅仅是您的单个方法。然后将绑定(类型注释)附加到在类顶部声明的类型T上,如下所示:

class EventUtility<T: PartyEvent | AppointmentEvent | MealEvent> {

现在,您的班级将接受某种类型的T,但前提是T与您给定的界限匹配。您只能在内部对类型为T的值进行操作,该值允许类型为边界类型的值使用,而用于创建类实例的任何类型T都是与用于返回值的类型相同。

第二个挑战是如何确保在同一时间只将一种事件存储在您的类中。这具有挑战性,因为类型T是联合类型,这意味着它可以是三种类型中的任何一种。 Flow将使您可以使用PartyEvent对象数组实例化该类,在这种情况下,T将具有类型PartyEvent,但也将允许您使用{{ 1}}和MealEvent对象,在这种情况下,AppointmentEvent的类型为T。您可以通过在使用MealEvent | AppointmentEvent的地方提供显式类型注释来解决此问题,并说明要包含的类型。即使Flow允许您使用类型的组合实例化EventUtility,但是如果使用比在显式批注中声明的类型大的类型来实例化EventUtility,也会出错。

Here's在Flow游乐场的示例解决方案。尝试为T创建具有不同界限的类,并取消对某些调用的注释,以查看出现了哪些错误。将{ startTime: Date }用作T的边界,应该会得到相同的结果。