Javascript 对类使用泛型类型

Javascript 对类使用泛型类型,javascript,class,flowtype,generic-type-argument,Javascript,Class,Flowtype,Generic Type Argument,我正在使用Flow,有一个泛型类型的用例,但不知道如何使用它们 我有一个类,它接受一种类型的事件数组。所有事件类型共享某些属性(如startTime),但在其他属性上有所不同。类函数的返回值应与构造函数数组中传递的事件的类型相同 为了更具体,在下面的代码中,我想规定,如果您使用PartyEvents数组创建一个EventUtility实例,那么当您请求EventUtility.earliestEvent()时,您可以确保您将得到一个PartyEvent返回。(传递给构造函数的数组不能由不同类型的

我正在使用Flow,有一个泛型类型的用例,但不知道如何使用它们

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

为了更具体,在下面的代码中,我想规定,如果您使用
PartyEvent
s数组创建一个
EventUtility
实例,那么当您请求
EventUtility.earliestEvent()
时,您可以确保您将得到一个
PartyEvent
返回。(传递给构造函数的数组不能由不同类型的对象混合组成。)

谢谢

export class EventUtility {
    // pick item based on JSON-friendly conditional notation
    events: Array<PartyEvent | AppointmentEvent | MealEvent>

    constructor(events: Array<PartyEvent | AppointmentEvent | MealEvent>) {
        this.events = events;
    }

    earliestEvent(): PartyEvent | AppointmentEvent | MealEvent {
        // determine earliest event in array and return it
        return event;
    }
}
导出类事件实用程序{
//基于JSON友好的条件表示法选择项
事件:数组
构造函数(事件:数组){
这个事件=事件;
}
earliestEvent():PartyEvent |任命事件| MealEvent{
//确定数组中最早的事件并返回它
返回事件;
}
}

您要查找的是有界泛型。它们在流程文档中进行了解释

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

class EventUtility<T: PartyEvent | AppointmentEvent | MealEvent> {
class事件实用程序{
现在,您的类将接受某些类型的
T
,但前提是
T
与您给定的绑定相匹配。您只能对类型为绑定类型的值内部允许的
T
类型的值执行操作,并且用于创建类实例的任何类型的
T
都与所指定的类型相同将用于返回值

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


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

太棒了!非常感谢!