Skip to content

Commit

Permalink
fix: fix type definitions (#95)
Browse files Browse the repository at this point in the history
  • Loading branch information
jiripudil authored and gregberge committed Jun 13, 2018
1 parent c36de05 commit 8402c19
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 48 deletions.
16 changes: 16 additions & 0 deletions server.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// TypeScript Version: 2.4

import * as React from 'react';

export function getLoadableState(
rootElement: React.ReactElement<{}>,
rootContext?: any,
fetchRoot?: boolean,
tree?: any,
): Promise<DeferredState>;

export interface DeferredState {
getScriptContent(): string;
getScriptTag(): string;
getScriptElement(): React.ReactHTMLElement<HTMLScriptElement>;
}
74 changes: 31 additions & 43 deletions types/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,56 +1,44 @@
// TypeScript Version: 2.4
// export as namespace LoadableComponents;

declare module 'loadable-components' {
import * as React from 'react';
import * as React from 'react';

interface DefaultImportedComponent<P> {
default: React.ComponentType<P>;
}
export as namespace loadable;

type DefaultComponent<P> = React.ComponentType<P> | DefaultImportedComponent<P>;
export default function loadable<T>(
getComponent: () => Promise<loadable.DefaultComponent<T>>,
options?: loadable.LoadableOptions<T>
): loadable.Loadable<T>;

export interface ComponentTracker {
track: (component: React.Component, modules: any, index?: number) => number;

get: (id: number) => React.ComponentType;
getAll: () => { [key: number]: React.ComponentType };
reset: () => void;
}

export interface LoadableOptions<T> {
ErrorComponent?: React.ComponentType;
LoadingComponent?: React.ComponentType;
render?: (options: { loading: boolean, error: boolean, ownProps: T, Component: React.ComponentType<T> }) => React.ReactElement<T>;
modules?: any;
}
export interface DefaultImportedComponent<P> {
default: React.ComponentType<P>;
}

interface Loadable<T> extends React.ComponentClass<T> {
Component: React.ComponentClass;
loadingPromise: Promise<any>;
load(): Promise<any>;
}
export type DefaultComponent<P> = React.ComponentType<P> | DefaultImportedComponent<P>;

export const componentTracker: ComponentTracker;
export const LOADABLE: string;
export interface ComponentTracker {
track: (component: React.Component, modules: any, index?: number) => number;

export function loadComponents(): Promise<any>;
get: (id: number) => React.ComponentType;
getAll: () => { [key: number]: React.ComponentType };
reset: () => void;
}

export function getState(): { __LOADABLE_STATE__: { children: Array<{ id: number }> } };
export interface LoadableOptions<T> {
ErrorComponent?: React.ComponentType;
LoadingComponent?: React.ComponentType;
render?: (options: { loading: boolean, error: boolean, ownProps: T, Component: React.ComponentType<T> }) => React.ReactElement<T>;
modules?: any;
}

export default function loadable<T>(
getComponent: () => Promise<DefaultComponent<T>>,
options?: LoadableOptions<T>
): Loadable<T>;
export interface Loadable<T> extends React.ComponentClass<T> {
Component: React.ComponentClass;
loadingPromise: Promise<any>;
load(): Promise<any>;
}

declare module 'loadable-components/server' {
import * as React from 'react';
export const componentTracker: ComponentTracker;
export const LOADABLE: string;

export function getLoadableState(
rootElement: React.ReactElement<{}>,
rootContext?: any,
fetchRoot?: boolean,
tree?: any,
): Promise<any>;
}
export function loadComponents(): Promise<any>;

export function getState(): { __LOADABLE_STATE__: { children: Array<{ id: number }> } };
9 changes: 6 additions & 3 deletions types/test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import * as React from 'react';
import loadableComponent, { loadComponents } from 'loadable-components';
import { getLoadableState } from 'loadable-components/server';
import { DeferredState, getLoadableState } from 'loadable-components/server';

const App = loadableComponent(() => import('./TestComponent'));

Expand All @@ -13,15 +13,18 @@ const app = (
<App prop1={"1"} prop2={2}/>
);

getLoadableState(app).then(() => {
getLoadableState(app).then((serverState) => {
// Load all components needed before starting rendering
loadComponents().then(() => {
loadComponents().then((state) => {
// $ExpectError
const a1 = <App prop1={4} prop2="4"/>;

// $ExpectError
const a2 = <App/>;

const a3 = <App prop1={"4"} prop2={4}/>;

// $ExpectType ReactHTMLElement<HTMLScriptElement>
const scriptElement = serverState.getScriptElement();
});
});
9 changes: 7 additions & 2 deletions types/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
"noImplicitThis": true,
"strictNullChecks": true,
"noEmit": true,
"strictFunctionTypes": false
"strictFunctionTypes": false,
"baseUrl": ".",
"paths": {
"loadable-components": ["."],
"loadable-components/server": ["../server"]
}
}
}
}

0 comments on commit 8402c19

Please sign in to comment.