/** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /** * A UI node that can be rendered by React. React can render most primitives in * addition to elements and arrays of nodes. */ declare type React$Node = | null | boolean | number | string | React$Element | React$Portal | Iterable; /** * Base class of ES6 React classes, modeled as a polymorphic class whose main * type parameters are Props and State. */ declare class React$Component { // fields props: Props; state: State; // action methods setState( partialState: ?$Shape | ((State, Props) => ?$Shape), callback?: () => mixed, ): void; forceUpdate(callback?: () => void): void; // lifecycle methods constructor(props?: Props, context?: any): void; render(): React$Node; componentWillMount(): mixed; UNSAFE_componentWillMount(): mixed; componentDidMount(): mixed; componentWillReceiveProps( nextProps: Props, nextContext: any, ): mixed; UNSAFE_componentWillReceiveProps( nextProps: Props, nextContext: any, ): mixed; shouldComponentUpdate( nextProps: Props, nextState: State, nextContext: any, ): boolean; componentWillUpdate( nextProps: Props, nextState: State, nextContext: any, ): mixed; UNSAFE_componentWillUpdate( nextProps: Props, nextState: State, nextContext: any, ): mixed; componentDidUpdate( prevProps: Props, prevState: State, prevContext: any, ): mixed; componentWillUnmount(): mixed; componentDidCatch( error: Error, info: { componentStack: string, } ): mixed; // long tail of other stuff not modeled very well refs: any; context: any; getChildContext(): any; static displayName?: ?string; static childContextTypes: any; static contextTypes: any; static propTypes: any; // We don't add a type for `defaultProps` so that its type may be entirely // inferred when we diff the type for `defaultProps` with `Props`. Otherwise // the user would need to define a type (which would be redundant) to override // the type we provide here in the base class. // // static defaultProps: $Shape; } declare class React$PureComponent extends React$Component { // TODO: Due to bugs in Flow's handling of React.createClass, some fields // already declared in the base class need to be redeclared below. Ideally // they should simply be inherited. props: Props; state: State; } /** * Base class of legacy React classes, which extends the base class of ES6 React * classes and supports additional methods. */ declare class LegacyReactComponent extends React$Component { // additional methods replaceState(state: State, callback?: () => void): void; isMounted(): bool; // TODO: Due to bugs in Flow's handling of React.createClass, some fields // already declared in the base class need to be redeclared below. Ideally // they should simply be inherited. props: Props; state: State; } declare type React$AbstractComponentStatics = { displayName?: ?string, // This is only on function components, but trying to access name when // displayName is undefined is a common pattern. name?: ?string, }; /** * The type of a stateless functional component. In most cases these components * are a single function. However, they may have some static properties that we * can type check. */ declare type React$StatelessFunctionalComponent = { (props: Props, context: any): React$Node, displayName?: ?string, propTypes?: any, contextTypes?: any }; /** * The type of a component in React. A React component may be a: * * - Stateless functional components. Functions that take in props as an * argument and return a React node. * - ES6 class component. Components with state defined either using the ES6 * class syntax, or with the legacy `React.createClass()` helper. */ declare type React$ComponentType<-Config> = React$AbstractComponent; /** * The type of an element in React. A React element may be a: * * - String. These elements are intrinsics that depend on the React renderer * implementation. * - React component. See `ComponentType` for more information about its * different variants. */ declare type React$ElementType = | string | React$AbstractComponent; /** * Type of a React element. React elements are commonly created using JSX * literals, which desugar to React.createElement calls (see below). */ declare type React$Element<+ElementType: React$ElementType> = {| +type: ElementType, +props: React$ElementProps, +key: React$Key | null, +ref: any, |}; /** * The type of the key that React uses to determine where items in a new list * have moved. */ declare type React$Key = string | number; /** * The type of the ref prop available on all React components. */ declare type React$Ref = | {current: React$ElementRef | null} | ((React$ElementRef | null) => mixed) | string; /** * The type of a React Context. React Contexts are created by calling * createContext() with a default value. */ declare type React$Context = { Provider: React$ComponentType<{ value: T, children?: ?React$Node }>, Consumer: React$ComponentType<{ children: (value: T) => ?React$Node }>, } /** * A React portal node. The implementation of the portal node is hidden to React * users so we use an opaque type. */ declare opaque type React$Portal; declare module react { declare export var DOM: any; declare export var PropTypes: ReactPropTypes; declare export var version: string; declare export function checkPropTypes( propTypes : any, values: V, location: string, componentName: string, getStack: ?(() => ?string) ) : void; declare export var createClass: React$CreateClass; declare export function createContext( defaultValue: T, calculateChangedBits: ?(a: T, b: T) => number, ): React$Context; declare export var createElement: React$CreateElement; declare export var cloneElement: React$CloneElement; declare export function createFactory( type: ElementType, ): React$ElementFactory; declare export function createRef( ): {current: null | T}; declare export function isValidElement(element: any): boolean; declare export var Component: typeof React$Component; declare export var PureComponent: typeof React$PureComponent; declare export type StatelessFunctionalComponent

= React$StatelessFunctionalComponent

; declare export type ComponentType<-P> = React$ComponentType

; declare export type AbstractComponent< -Config, +Instance = mixed, > = React$AbstractComponent; declare export type ElementType = React$ElementType; declare export type Element<+C> = React$Element; declare export var Fragment: ({children: ?React$Node}) => React$Node; declare export type Key = React$Key; declare export type Ref = React$Ref; declare export type Node = React$Node; declare export type Context = React$Context; declare export type Portal = React$Portal; declare export var ConcurrentMode: ({children: ?React$Node}) => React$Node; // 16.7+ declare export var StrictMode: ({children: ?React$Node}) => React$Node; declare export var Suspense: React$ComponentType<{ children?: ?React$Node, fallback?: React$Node, maxDuration?: number }>; // 16.6+ declare export type ElementProps = React$ElementProps; declare export type ElementConfig = React$ElementConfig; declare export type ElementRef = React$ElementRef; declare export type Config = React$Config; declare export type ChildrenArray<+T> = $ReadOnlyArray> | T; declare export var Children: { map( children: ChildrenArray, fn: (child: $NonMaybeType, index: number) => U, thisArg?: mixed, ): Array<$NonMaybeType>; forEach( children: ChildrenArray, fn: (child: T, index: number) => mixed, thisArg?: mixed, ): void; count(children: ChildrenArray): number; only(children: ChildrenArray): $NonMaybeType; toArray(children: ChildrenArray): Array<$NonMaybeType>; }; declare export function forwardRef( render: ( props: Config, ref: {current: null | Instance} | ((null | Instance) => mixed), ) => React$Node, ): React$AbstractComponent; declare export function memo

( component: React$StatelessFunctionalComponent

, equal?: (P, P) => boolean, ): React$StatelessFunctionalComponent

; declare export function lazy

( component: () => Promise<{ default: React$ComponentType

}>, ): React$ComponentType

; declare type MaybeCleanUpFn = ?(() => mixed); declare export function useContext( context: React$Context, observedBits: void | number | boolean, ): T; declare export function useState( initialState: (() => S) | S, ): [S, ((S => S) | S) => void]; declare export function useReducer( reducer: (S, A) => S, initialState: S, initialAction: ?A, ): [S, A => void]; declare export function useRef(initialValue: ?T): {current: T | null}; declare export function useEffect( create: () => MaybeCleanUpFn, inputs: ?$ReadOnlyArray, ): void; declare export function useLayoutEffect( create: () => MaybeCleanUpFn, inputs: ?$ReadOnlyArray, ): void; declare export function useCallback) => mixed>( callback: T, inputs: ?$ReadOnlyArray, ): T; declare export function useMemo( create: () => T, inputs: ?$ReadOnlyArray, ): T; declare export function useImperativeMethods( ref: {current: T | null} | ((inst: T | null) => mixed) | null | void, create: () => T, inputs: ?$ReadOnlyArray, ): void; declare export default {| +DOM: typeof DOM, +PropTypes: typeof PropTypes, +version: typeof version, +checkPropTypes: typeof checkPropTypes, +memo: typeof memo, +lazy: typeof lazy, +createClass: typeof createClass, +createContext: typeof createContext, +createElement: typeof createElement, +cloneElement: typeof cloneElement, +createFactory: typeof createFactory, +createRef: typeof createRef, +forwardRef: typeof forwardRef, +isValidElement: typeof isValidElement, +Component: typeof Component, +PureComponent: typeof PureComponent, +Fragment: typeof Fragment, +Children: typeof Children, +ConcurrentMode: typeof ConcurrentMode, +StrictMode: typeof StrictMode, +Suspense: typeof Suspense, +useContext: typeof useContext, +useState: typeof useState, +useReducer: typeof useReducer, +useRef: typeof useRef, +useEffect: typeof useEffect, +useLayoutEffect: typeof useLayoutEffect, +useCallback: typeof useCallback, +useMemo: typeof useMemo, +useImperativeMethods: typeof useImperativeMethods, |}; } // TODO Delete this once https://github.com/facebook/react/pull/3031 lands // and "react" becomes the standard name for this module declare module React { declare module.exports: $Exports<'react'>; } type ReactPropsCheckType = ( props: any, propName: string, componentName: string, href?: string) => ?Error; type ReactPropsChainableTypeChecker = { isRequired: ReactPropsCheckType; (props: any, propName: string, componentName: string, href?: string): ?Error; }; type React$PropTypes$arrayOf = (typeChecker: ReactPropsCheckType) => ReactPropsChainableTypeChecker; type React$PropTypes$instanceOf = (expectedClass: any) => ReactPropsChainableTypeChecker; type React$PropTypes$objectOf = (typeChecker: ReactPropsCheckType) => ReactPropsChainableTypeChecker; type React$PropTypes$oneOf = (expectedValues: Array) => ReactPropsChainableTypeChecker; type React$PropTypes$oneOfType = (arrayOfTypeCheckers: Array) => ReactPropsChainableTypeChecker; type React$PropTypes$shape = (shapeTypes: { [key: string]: ReactPropsCheckType }) => ReactPropsChainableTypeChecker; type ReactPropTypes = { array: React$PropType$Primitive>; bool: React$PropType$Primitive; func: React$PropType$Primitive; number: React$PropType$Primitive; object: React$PropType$Primitive; string: React$PropType$Primitive; any: React$PropType$Primitive; arrayOf: React$PropType$ArrayOf; element: React$PropType$Primitive; /* TODO */ instanceOf: React$PropType$InstanceOf; node: React$PropType$Primitive; /* TODO */ objectOf: React$PropType$ObjectOf; oneOf: React$PropType$OneOf; oneOfType: React$PropType$OneOfType; shape: React$PropType$Shape; }