mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
05418f8fcc
Summary: Flow is changing the behavior of object types to no longer be valid supertypes of classes. This replaces object types when they appear as supertypes of classes to be interfaces to avoid errors when this change rolls out. Changelog: [Internal] Reviewed By: pieterv Differential Revision: D27193522 fbshipit-source-id: c3e3fca8a4cacd90770a95b773ff2c659774b9a6
67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
* @flow strict
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
/**
|
|
* Defines a lazily evaluated property on the supplied `object`.
|
|
*/
|
|
function defineLazyObjectProperty<T>(
|
|
object: interface {},
|
|
name: string,
|
|
descriptor: {
|
|
get: () => T,
|
|
enumerable?: boolean,
|
|
writable?: boolean,
|
|
...
|
|
},
|
|
): void {
|
|
const {get} = descriptor;
|
|
const enumerable = descriptor.enumerable !== false;
|
|
const writable = descriptor.writable !== false;
|
|
|
|
let value;
|
|
let valueSet = false;
|
|
function getValue(): T {
|
|
// WORKAROUND: A weird infinite loop occurs where calling `getValue` calls
|
|
// `setValue` which calls `Object.defineProperty` which somehow triggers
|
|
// `getValue` again. Adding `valueSet` breaks this loop.
|
|
if (!valueSet) {
|
|
// Calling `get()` here can trigger an infinite loop if it fails to
|
|
// remove the getter on the property, which can happen when executing
|
|
// JS in a V8 context. `valueSet = true` will break this loop, and
|
|
// sets the value of the property to undefined, until the code in `get()`
|
|
// finishes, at which point the property is set to the correct value.
|
|
valueSet = true;
|
|
setValue(get());
|
|
}
|
|
return value;
|
|
}
|
|
function setValue(newValue: T): void {
|
|
value = newValue;
|
|
valueSet = true;
|
|
Object.defineProperty(object, name, {
|
|
value: newValue,
|
|
configurable: true,
|
|
enumerable,
|
|
writable,
|
|
});
|
|
}
|
|
|
|
Object.defineProperty(object, name, {
|
|
get: getValue,
|
|
set: setValue,
|
|
configurable: true,
|
|
enumerable,
|
|
});
|
|
}
|
|
|
|
module.exports = defineLazyObjectProperty;
|