在类中使用泛型类型

问题描述 投票:0回答:1

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

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

为了更具体,在下面的代码中,我想规定,如果你创建一个EventUtility数组PartyEvent的实例,那么当你要求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个回答
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的界限应该会给你相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.