使用具有 class 的泛型类型
Using generic types with a class
我正在使用 Flow 并且有泛型类型的用例,但不知道如何使用它们。
我有一个 class,它接受一种类型的事件数组。所有事件类型都共享一些属性(如 startTime
),但在其他属性上有所不同。 class 函数的 return 值应与构造函数数组中传递的事件具有相同类型。
为了更具体一点,在下面的代码中我想规定,如果你用一个 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.
中进行了解释
首先,使您的整个 class 在某些类型 T
上通用,而不仅仅是您的个别方法。然后将绑定(类型注释)附加到类型 T
,它在 class 的顶部声明,如下所示:
class EventUtility<T: PartyEvent | AppointmentEvent | MealEvent> {
现在您的 class 将接受某种类型 T
,但前提是 T
与您指定的范围相匹配。您只能在内部对类型为 T
的值做一些事情,这些值允许类型为绑定类型的值,并且任何类型 T
用于创建 [=42] 的实例=] 与将用于 return 值的类型相同。
第二个挑战是如何确保您的 class 同时只存储一种事件。这具有挑战性,因为类型 T
是联合类型,这意味着它可以是这三种类型中的任何一种。 Flow 将允许您使用 PartyEvent
对象数组实例化 class,在这种情况下,T
将具有类型 PartyEvent
,但它也将允许您使用一个实例化它MealEvent
和 AppointmentEvent
对象的数组,在这种情况下 T
的类型为 MealEvent | AppointmentEvent
。您可以通过在使用 EventUtility
的地方提供显式类型注释来解决这个问题,说明您希望它包含哪种类型。尽管 Flow 允许您使用类型组合实例化 EventUtility
,但如果您使用比您在显式注释中声明的更大的类型实例化它,它将出错。
Here's Flow 游乐场中您的示例的解决方案。尝试为 T
创建具有不同边界的 class 并取消注释某些调用以查看弹出的错误。使用 { startTime: Date }
作为 T
的边界应该给你相同的结果。
我正在使用 Flow 并且有泛型类型的用例,但不知道如何使用它们。
我有一个 class,它接受一种类型的事件数组。所有事件类型都共享一些属性(如 startTime
),但在其他属性上有所不同。 class 函数的 return 值应与构造函数数组中传递的事件具有相同类型。
为了更具体一点,在下面的代码中我想规定,如果你用一个 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.
中进行了解释首先,使您的整个 class 在某些类型 T
上通用,而不仅仅是您的个别方法。然后将绑定(类型注释)附加到类型 T
,它在 class 的顶部声明,如下所示:
class EventUtility<T: PartyEvent | AppointmentEvent | MealEvent> {
现在您的 class 将接受某种类型 T
,但前提是 T
与您指定的范围相匹配。您只能在内部对类型为 T
的值做一些事情,这些值允许类型为绑定类型的值,并且任何类型 T
用于创建 [=42] 的实例=] 与将用于 return 值的类型相同。
第二个挑战是如何确保您的 class 同时只存储一种事件。这具有挑战性,因为类型 T
是联合类型,这意味着它可以是这三种类型中的任何一种。 Flow 将允许您使用 PartyEvent
对象数组实例化 class,在这种情况下,T
将具有类型 PartyEvent
,但它也将允许您使用一个实例化它MealEvent
和 AppointmentEvent
对象的数组,在这种情况下 T
的类型为 MealEvent | AppointmentEvent
。您可以通过在使用 EventUtility
的地方提供显式类型注释来解决这个问题,说明您希望它包含哪种类型。尽管 Flow 允许您使用类型组合实例化 EventUtility
,但如果您使用比您在显式注释中声明的更大的类型实例化它,它将出错。
Here's Flow 游乐场中您的示例的解决方案。尝试为 T
创建具有不同边界的 class 并取消注释某些调用以查看弹出的错误。使用 { startTime: Date }
作为 T
的边界应该给你相同的结果。