我正在使用Flow,并具有通用类型的用例,但不知道如何使用它们。
我有一个类,它接受一种类型的事件数组。所有事件类型都共享某些属性(例如startTime
),而其他属性则有所不同。类函数的返回值应该与构造函数数组中传递的事件具有相同的类型。
为了更具体一点,在下面的代码中,我想说明一下:如果您创建带有数组EventUtility
的{{1}}实例,那么当您要求{{1} },您可以肯定会得到PartyEvent
的回报。 (传递给构造函数的数组不能包含不同类型的对象的混合物。)
谢谢。
EventUtility.earliestEvent()
答案 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
的边界,应该会得到相同的结果。