UNPKG

4.15 kBTypeScriptView Raw
1/**
2 * Turns a React component or stateless render function into a reactive component.
3 */
4import * as React from "react"
5
6export type IReactComponent<P = any> =
7 | React.StatelessComponent<P>
8 | React.ComponentClass<P>
9 | React.ClassicComponentClass<P>
10
11/**
12 * Observer
13 */
14
15// Deprecated: observer with with stores (as decorator)
16export function observer(stores: string[]): <T extends IReactComponent>(clazz: T) => void
17// Deprecated: observer with with stores
18export function observer<T extends IReactComponent>(stores: string[], clazz: T): T
19export function observer<T extends IReactComponent>(target: T): T
20
21/**
22 * Inject
23 */
24export type IValueMap = { [key: string]: any }
25export type IStoresToProps<
26 S extends IValueMap = {},
27 P extends IValueMap = {},
28 I extends IValueMap = {},
29 C extends IValueMap = {}
30> = (stores: S, nextProps: P, context: C) => I
31
32export type IWrappedComponent<P> = {
33 wrappedComponent: IReactComponent<P>
34 wrappedInstance: React.ReactInstance | undefined
35}
36
37// Ideally we would want to return React.ComponentClass<Partial<P>>,
38// but TS doesn't allow such things in decorators, like we do in the non-decorator version
39// See also #256
40export function inject(
41 ...stores: string[]
42): <T extends IReactComponent<any>>(
43 target: T
44) => T & (T extends IReactComponent<infer P> ? IWrappedComponent<P> : never)
45export function inject<S, P, I, C>(
46 fn: IStoresToProps<S, P, I, C>
47): <T extends IReactComponent>(target: T) => T & IWrappedComponent<P>
48
49// Ideal implementation:
50// export function inject
51// (
52// fn: IStoresToProps
53// ):
54// <P>(target: IReactComponent<P>) => IReactComponent<Partial<P>> & IWrappedComponent<IReactComponent<Partial<P>>>
55//
56// Or even better: (but that would require type inference to work other way around)
57// export function inject<P, I>
58// (
59// fn: IStoresToProps<any, P, I>
60// ):
61// <T extends IReactComponent<P & S>(target: T) => IReactComponent<P> & IWrappedComponent<T>
62
63/**
64 * disposeOnUnmount
65 */
66type Disposer = () => void
67export function disposeOnUnmount(target: React.Component<any, any>, propertyKey: string): void
68export function disposeOnUnmount<TF extends Disposer | Disposer[]>(
69 target: React.Component<any, any>,
70 fn: TF
71): TF
72
73/**
74 * Utilities
75 */
76export function onError(cb: (error: Error) => void): () => void
77
78export class Provider extends React.Component<any, {}> {}
79
80export class Observer extends React.Component<
81 {
82 children?: () => React.ReactNode
83 render?: () => React.ReactNode
84 },
85 {}
86> {}
87
88export function useStaticRendering(value: boolean): void
89
90/**
91 * Enable dev tool support, makes sure that renderReport emits events.
92 */
93export function trackComponents(): void
94
95export const renderReporter: RenderReporter
96
97export interface RenderReporter {
98 on(handler: (data: IRenderEvent) => void): void
99}
100
101export interface IRenderEvent {
102 event: "render" | "destroy"
103 renderTime?: number
104 totalTime?: number
105 component: React.ReactElement<any> // Component instance
106 node: any // DOMNode
107}
108
109/**
110 * WeakMap DOMNode -> Component instance
111 * @deprecated
112 */
113export const componentByNodeRegistery: any
114/**
115 * WeakMap DOMNode -> Component instance
116 */
117export const componentByNodeRegistry: any
118
119/**
120 * @deprecated, use PropTypes instead
121 */
122export const propTypes: {
123 observableArray: React.Requireable<any>
124 observableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
125 observableMap: React.Requireable<any>
126 observableObject: React.Requireable<any>
127 arrayOrObservableArray: React.Requireable<any>
128 arrayOrObservableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
129 objectOrObservableObject: React.Requireable<any>
130}
131
132export const PropTypes: {
133 observableArray: React.Requireable<any>
134 observableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
135 observableMap: React.Requireable<any>
136 observableObject: React.Requireable<any>
137 arrayOrObservableArray: React.Requireable<any>
138 arrayOrObservableArrayOf: (type: React.Validator<any>) => React.Requireable<any>
139 objectOrObservableObject: React.Requireable<any>
140}
141
\No newline at end of file