UNPKG

2.69 kBTypeScriptView Raw
1/**
2 * Turns a React component or stateless render function into a reactive component.
3 */
4import * as React from "react"
5
6export { useAsObservableSource, useLocalStore, IObserverOptions, Observer } from "mobx-react-lite"
7
8export type IReactComponent<P = any> =
9 | React.StatelessComponent<P>
10 | React.ComponentClass<P>
11 | React.ClassicComponentClass<P>
12
13/**
14 * Observer
15 */
16
17export function observer<T extends IReactComponent>(target: T): T
18
19/**
20 * Inject
21 */
22export type IValueMap = { [key: string]: any }
23export type IStoresToProps<
24 S extends IValueMap = {},
25 P extends IValueMap = {},
26 I extends IValueMap = {},
27 C extends IValueMap = {}
28> = (stores: S, nextProps: P, context: C) => I
29
30export type IWrappedComponent<P> = {
31 wrappedComponent: IReactComponent<P>
32}
33
34// Ideally we would want to return React.ComponentClass<Partial<P>>,
35// but TS doesn't allow such things in decorators, like we do in the non-decorator version
36// See also #256
37export function inject(
38 ...stores: string[]
39): <T extends IReactComponent<any>>(
40 target: T
41) => T & (T extends IReactComponent<infer P> ? IWrappedComponent<P> : never)
42export function inject<S, P, I, C>(
43 fn: IStoresToProps<S, P, I, C>
44): <T extends IReactComponent>(target: T) => T & IWrappedComponent<P>
45
46// Ideal implementation:
47// export function inject
48// (
49// fn: IStoresToProps
50// ):
51// <P>(target: IReactComponent<P>) => IReactComponent<Partial<P>> & IWrappedComponent<IReactComponent<Partial<P>>>
52//
53// Or even better: (but that would require type inference to work other way around)
54// export function inject<P, I>
55// (
56// fn: IStoresToProps<any, P, I>
57// ):
58// <T extends IReactComponent<P & S>(target: T) => IReactComponent<P> & IWrappedComponent<T>
59
60/**
61 * disposeOnUnmount
62 */
63type Disposer = () => void
64export function disposeOnUnmount(target: React.Component<any, any>, propertyKey: string): void
65export function disposeOnUnmount<TF extends Disposer | Disposer[]>(
66 target: React.Component<any, any>,
67 fn: TF
68): TF
69
70/**
71 * Utilities
72 */
73export class Provider extends React.Component<any, {}> {}
74
75export const MobXProviderContext: React.Context<any>
76
77export function useStaticRendering(value: boolean): void
78export function isUsingStaticRendering(): boolean
79
80export const PropTypes: {
81 observableArray: React.Requireable<any>
82 observableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
83 observableMap: React.Requireable<any>
84 observableObject: React.Requireable<any>
85 arrayOrObservableArray: React.Requireable<any>
86 arrayOrObservableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
87 objectOrObservableObject: React.Requireable<any>
88}
89
\No newline at end of file