From 75f458891fd18c7cf1925abbc9cbdb1cedb28d3e Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Mon, 24 Jul 2023 11:30:39 -0700 Subject: [PATCH] RN: Adopt Mapped Types in EventEmitter Summary: Migrates `EventEmitter` in React Native to use the newly introduced mapped types in Flow, instead of `$ObjMap`. Changelog: [Internal] Reviewed By: jbrown215 Differential Revision: D47296240 fbshipit-source-id: 435d0a19242dcd13a4a6c7824daf0e894445cfa7 --- .../Libraries/vendor/emitter/EventEmitter.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/react-native/Libraries/vendor/emitter/EventEmitter.js b/packages/react-native/Libraries/vendor/emitter/EventEmitter.js index 904b77a3226..2a9c9aab0b2 100644 --- a/packages/react-native/Libraries/vendor/emitter/EventEmitter.js +++ b/packages/react-native/Libraries/vendor/emitter/EventEmitter.js @@ -35,10 +35,9 @@ interface Registration { +remove: () => void; } -type Registry = $ObjMap< - TEventToArgsMap, - (TArgs) => Set>, ->; +type Registry = { + [key in keyof TEventToArgsMap]?: Set>, +}; /** * EventEmitter manages listeners and publishes events to them. @@ -63,7 +62,7 @@ type Registry = $ObjMap< export default class EventEmitter implements IEventEmitter { - _registry: Registry = {}; + _registry: Registry = emptyRegistry(); /** * Registers a listener that is called when the supplied event is emitted. @@ -122,7 +121,7 @@ export default class EventEmitter eventType?: ?TEvent, ): void { if (eventType == null) { - this._registry = {}; + this._registry = emptyRegistry(); } else { delete this._registry[eventType]; } @@ -137,6 +136,13 @@ export default class EventEmitter } } +function emptyRegistry(): Registry { + // Flow cannot enforce that `TEventToArgsMap` is an object because, for + // example, Flow permits `empty. We have to ignore this error for now. + // $FlowIgnore[incompatible-return] + return {}; +} + function allocate< TEventToArgsMap: {...}, TEvent: $Keys,