UNPKG

3.76 kBTypeScriptView Raw
1// Type definitions for @loadable/component 5.13
2// Project: https://github.com/smooth-code/loadable-components
3// Definitions by: Martynas Kadiša <https://github.com/martynaskadisa>
4// Daniel Playfair Cal <https://github.com/hedgepigdaniel>
5// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
6// TypeScript Version: 2.8
7
8import * as React from 'react';
9
10export interface DefaultImportedComponent<Props> {
11 default: React.ComponentType<Props>;
12}
13
14export type DefaultComponent<Props> = React.ComponentType<Props> | DefaultImportedComponent<Props>;
15
16/**
17 * Synchronous function that returns the component from the
18 * imported module.
19 *
20 * The default works with default exports, both CommonJS or ESM
21 */
22export type ComponentResolver<Props, Module = DefaultComponent<Props>> = (
23 module: Module,
24 props: Props,
25) => React.ComponentType<Props>;
26
27export interface OptionsWithoutResolver<Props> {
28 cacheKey?(props: Props): any;
29 fallback?: JSX.Element | undefined;
30 ssr?: boolean | undefined;
31}
32
33export interface Options<Props, Module = DefaultComponent<Props>> extends OptionsWithoutResolver<Props> {
34 resolveComponent?: ComponentResolver<Props, Module> | undefined;
35}
36
37export interface OptionsWithResolver<Props, Module = DefaultComponent<Props>> extends OptionsWithoutResolver<Props> {
38 resolveComponent: ComponentResolver<Props, Module>;
39}
40
41export interface LoadableReadyOptions {
42 namespace?: string | undefined;
43}
44
45export interface LoadableComponentMethods<Props> {
46 preload(props?: Props): void;
47 load(props?: Props): Promise<React.ComponentType<Props>>;
48}
49
50export interface ExtraComponentProps {
51 fallback?: JSX.Element | undefined;
52}
53
54export type LoadableComponent<Props> = React.ComponentType<Props & ExtraComponentProps> &
55 LoadableComponentMethods<Props>;
56
57export interface ExtraClassComponentProps<Component extends React.ComponentClass> extends ExtraComponentProps {
58 ref?: React.LegacyRef<InstanceType<Component>> | undefined;
59}
60
61export type LoadableClassComponent<Component extends React.ComponentClass> = React.ComponentType<
62 React.ComponentProps<Component> & ExtraClassComponentProps<Component>
63> &
64 LoadableComponentMethods<React.ComponentProps<Component>>;
65
66export type LoadableLibrary<Module> = React.ComponentType<{
67 fallback?: JSX.Element | undefined;
68 children?: ((module: Module) => React.ReactNode) | undefined;
69 ref?: React.Ref<Module> | undefined;
70}> &
71 Module &
72 LoadableComponentMethods<object>;
73
74declare function lib<Props, Module>(
75 loadFn: (props: Props) => Promise<Module>,
76 options?: OptionsWithoutResolver<Props>,
77): LoadableLibrary<Module>;
78
79declare function loadableFunc<Props, Module = DefaultComponent<Props>>(
80 loadFn: (props: Props) => Promise<Module>,
81 options: OptionsWithResolver<Props, Module>,
82): LoadableComponent<Props>;
83
84declare function loadableFunc<Props>(
85 loadFn: (props: Props) => Promise<DefaultComponent<Props>>,
86 options?: OptionsWithoutResolver<Props>,
87): LoadableComponent<Props>;
88
89declare function loadableFunc<Component extends React.ComponentClass<any>>(
90 loadFn: (props: React.ComponentProps<Component>) => Promise<Component | { default: Component }>,
91 options?: Options<React.ComponentProps<Component>, Component>,
92): LoadableClassComponent<Component>;
93
94declare const loadable: typeof loadableFunc & { lib: typeof lib };
95
96export default loadable;
97
98export namespace lazy {
99 function lib<Module>(loadFn: (props: object) => Promise<Module>): LoadableLibrary<Module>;
100}
101
102export function lazy<Props>(loadFn: (props: Props) => Promise<DefaultComponent<Props>>): LoadableComponent<Props>;
103
104export function loadableReady(done?: () => any, options?: LoadableReadyOptions): Promise<void>;
105
\No newline at end of file