Add types for react-resolver

This commit is contained in:
Muhammad Fawwaz Orabi
2017-11-30 00:33:28 +02:00
parent 420f99c1dc
commit c61ecc215c
4 changed files with 141 additions and 0 deletions

71
types/react-resolver/index.d.ts vendored Normal file
View File

@@ -0,0 +1,71 @@
// Type definitions for react-resolver 3.1
// Project: https://github.com/ericclemmons/react-resolver
// Definitions by: forabi <https://github.com/forabi>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import { ComponentType, StatelessComponent, Factory } from 'react';
export type AnyComponent<P> = ComponentType<P>;
export interface Resolver {
resolve<P, D>(
factory: Factory<P>,
): Promise<{
data: D;
Resolved: StatelessComponent<P>;
}>;
render<P>(factory: Factory<P>, root: Node | null): void;
}
export const Resolver: Resolver;
export type ResolveFn<Props, V> = (props: Props) => Promise<V>;
/** Use this for gaining access to a context as a prop without the boilerplate of setting `contextTypes`. */
export function context<K extends string, V = any>(
prop: K,
): <OwnProps>(
component: AnyComponent<OwnProps>,
) => StatelessComponent<OwnProps & Record<typeof prop, V>>;
/**
* Use `@client(LoaderComponent)` (or `client(LoaderComponent)(YourComponent)`)
* for when you want to skip server-side rendering of part of your view and
* perform it only on the client.
*/
export function client(
loadingComponent: AnyComponent<any>,
): <OwnProps>(
component: AnyComponent<OwnProps>,
) => StatelessComponent<OwnProps>;
export function resolve<
OwnProps,
K extends string,
V,
MoreProps = { [x: string]: any }
>(
prop: K,
resolveFn: ResolveFn<OwnProps & MoreProps, V>,
): (
component: AnyComponent<OwnProps & { [C in K]: V }>,
) => StatelessComponent<OwnProps & MoreProps>;
export function resolve<
OwnProps,
ResolvableProps = { [x: string]: any },
MoreProps = { [x: string]: any }
>(
resolversMap: {
[K in keyof ResolvableProps]: ResolveFn<
OwnProps & MoreProps,
ResolvableProps[K]
>
},
): (
component: AnyComponent<
OwnProps & { [K in keyof ResolvableProps]?: ResolvableProps[K] }
>,
) => StatelessComponent<OwnProps & MoreProps>;

View File

@@ -0,0 +1,44 @@
import * as React from 'react';
import { Resolver, resolve } from 'react-resolver';
import * as expect from 'expect';
interface OwnProps {
thing: number;
}
interface ResolvedProps {
data: string;
}
class Page extends React.Component<OwnProps & ResolvedProps> {
render() {
return <div>Hello, {this.props.data}!</div>;
}
}
const ResolvedPageWithSingleProp = resolve('data', async () => {
return new Promise<string>(resolve => {
setTimeout(() => resolve('World'), 500);
});
})(Page);
const ResolvedPageWithPropMap = resolve({
data: async () => {
return new Promise<string>(resolve => {
setTimeout(() => resolve('World'), 500);
});
},
})(Page);
expect(<ResolvedPageWithSingleProp />).toExist();
expect(<ResolvedPageWithPropMap />).toExist();
// Resolver.render(() => <ResolvedPageWithPropMap />, document.getElementById('app'));
Resolver.resolve(() => {
return (
<ResolvedPageWithPropMap />
);
}).then(({ data, Resolved }) => {
expect(data).toBe('World');
});

View File

@@ -0,0 +1,25 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6",
"dom"
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true,
"jsx": "react"
},
"files": [
"index.d.ts",
"test.tsx"
]
}

View File

@@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }