mirror of
https://github.com/zhigang1992/DefinitelyTyped.git
synced 2026-06-05 20:02:05 +08:00
Add types for react-resolver
This commit is contained in:
71
types/react-resolver/index.d.ts
vendored
Normal file
71
types/react-resolver/index.d.ts
vendored
Normal 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>;
|
||||
44
types/react-resolver/test.tsx
Normal file
44
types/react-resolver/test.tsx
Normal 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');
|
||||
});
|
||||
25
types/react-resolver/tsconfig.json
Normal file
25
types/react-resolver/tsconfig.json
Normal 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"
|
||||
]
|
||||
}
|
||||
1
types/react-resolver/tslint.json
Normal file
1
types/react-resolver/tslint.json
Normal file
@@ -0,0 +1 @@
|
||||
{ "extends": "dtslint/dt.json" }
|
||||
Reference in New Issue
Block a user