【问题标题】:Using generic types with a class对类使用泛型类型
【发布时间】:2019-07-26 09:28:18
【问题描述】:

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

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

为了更具体,在下面的代码中,我想规定,如果您创建一个带有 PartyEvents 数组的 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;
    }
}

【问题讨论】:

    标签: javascript class flowtype generic-type-argument


    【解决方案1】:

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

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

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

    现在你的类将接受一些类型T,但前提是T 匹配你给它的界限。您只能在内部对类型为 T 的值执行操作,而该值的类型是绑定的类型,并且用于创建类实例的任何类型 T 与将用于返回值。

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

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

    【讨论】:

    • 太棒了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多