mobx-react
Version:
React bindings for MobX. Create fully reactive components.
89 lines (75 loc) • 2.69 kB
TypeScript
/**
* Turns a React component or stateless render function into a reactive component.
*/
import * as React from "react"
export { useAsObservableSource, useLocalStore, IObserverOptions, Observer } from "mobx-react-lite"
export type IReactComponent<P = any> =
| React.StatelessComponent<P>
| React.ComponentClass<P>
| React.ClassicComponentClass<P>
/**
* Observer
*/
export function observer<T extends IReactComponent>(target: T): T
/**
* Inject
*/
export type IValueMap = { [key: string]: any }
export type IStoresToProps<
S extends IValueMap = {},
P extends IValueMap = {},
I extends IValueMap = {},
C extends IValueMap = {}
> = (stores: S, nextProps: P, context: C) => I
export type IWrappedComponent<P> = {
wrappedComponent: IReactComponent<P>
}
// Ideally we would want to return React.ComponentClass<Partial<P>>,
// but TS doesn't allow such things in decorators, like we do in the non-decorator version
// See also #256
export function inject(
...stores: string[]
): <T extends IReactComponent<any>>(
target: T
) => T & (T extends IReactComponent<infer P> ? IWrappedComponent<P> : never)
export function inject<S, P, I, C>(
fn: IStoresToProps<S, P, I, C>
): <T extends IReactComponent>(target: T) => T & IWrappedComponent<P>
// Ideal implementation:
// export function inject
// (
// fn: IStoresToProps
// ):
// <P>(target: IReactComponent<P>) => IReactComponent<Partial<P>> & IWrappedComponent<IReactComponent<Partial<P>>>
//
// Or even better: (but that would require type inference to work other way around)
// export function inject<P, I>
// (
// fn: IStoresToProps<any, P, I>
// ):
// <T extends IReactComponent<P & S>(target: T) => IReactComponent<P> & IWrappedComponent<T>
/**
* disposeOnUnmount
*/
type Disposer = () => void
export function disposeOnUnmount(target: React.Component<any, any>, propertyKey: string): void
export function disposeOnUnmount<TF extends Disposer | Disposer[]>(
target: React.Component<any, any>,
fn: TF
): TF
/**
* Utilities
*/
export class Provider extends React.Component<any, {}> {}
export const MobXProviderContext: React.Context<any>
export function useStaticRendering(value: boolean): void
export function isUsingStaticRendering(): boolean
export const PropTypes: {
observableArray: React.Requireable<any>
observableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
observableMap: React.Requireable<any>
observableObject: React.Requireable<any>
arrayOrObservableArray: React.Requireable<any>
arrayOrObservableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
objectOrObservableObject: React.Requireable<any>
}