javascript - 在类中使用泛型类型

标签 javascript class flowtype generic-type-argument

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

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

为了使这一点更具体,在下面的代码中我想规定,如果您使用 PartyEvent 数组创建 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;
    }
}

最佳答案

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

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

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

现在,您的类将接受某种类型 T,但前提是 T 与您指定的边界匹配。您只能在内部对 T 类型的值执行其类型为绑定(bind)类型的值所允许的操作,并且无论使用什么类型 T 来创建该类的实例与将用于返回值的类型相同。

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

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

关于javascript - 在类中使用泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54993900/

相关文章:

javascript - 通过 D3 的 .attr 分配的多个类不在序列化 (serializeToString) 字符串中

c++ - 在 header 中使用构造函数初始化类

C++ 一个文件多个类

python - 在python中覆盖类变量?

javascript - Flow中如何根据输入值表达对象返回类型?

javascript - 我可以在 React Storybook 中创建一个旋钮来修改具有 4 个值的数组,其中每个值都有一个选择下拉列表吗?

webpack - 如何在nuxt中添加流(flowtype)支持?

javascript - 删除 jQuery 对简单文本旋转的依赖

javascript - 没有 var、let 或 const 的对象解构

javascript - Backbone - 使用从另一个 API 轮询的数据更新集合中的模型