UNPKG

5.08 kBTypeScriptView Raw
1// TypeScript Version: 3.0
2
3// changed from: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/styled-components
4/* eslint-disable */
5
6import * as React from 'react';
7
8export type IntrinsicElementsKeys = keyof JSX.IntrinsicElements;
9
10// Any prop that has a default prop becomes optional, but its type is unchanged
11// Undeclared default props are augmented into the resulting allowable attributes
12// If declared props have indexed properties, ignore default props entirely as keyof gets widened
13// Wrap in an outer-level conditional type to allow distribution over props that are unions
14type Defaultize<P, D> = P extends any
15 ? string extends keyof P
16 ? P
17 : Pick<P, Exclude<keyof P, keyof D>> &
18 Partial<Pick<P, Extract<keyof P, keyof D>>> &
19 Partial<Pick<D, Exclude<keyof D, keyof P>>>
20 : never;
21
22type ReactDefaultizedProps<C, P> = C extends { defaultProps: infer D }
23 ? Defaultize<P, D>
24 : P;
25
26type MakeAttrsOptional<
27 C extends string | React.ComponentType<any>,
28 O extends object,
29 A extends keyof any
30> = Omit<
31 ReactDefaultizedProps<
32 C,
33 React.ComponentPropsWithRef<
34 C extends IntrinsicElementsKeys | React.ComponentType<any> ? C : never
35 >
36 > &
37 O,
38 A
39> &
40 Partial<
41 Pick<
42 React.ComponentPropsWithRef<
43 C extends IntrinsicElementsKeys | React.ComponentType<any> ? C : never
44 > &
45 O,
46 A
47 >
48 >;
49
50export type StyledComponentProps<
51 // The Component from whose props are derived
52 C extends keyof string | React.ComponentType<any>,
53 // The other props added by the template
54 O extends object,
55 // The props that are made optional by .attrs
56 A extends keyof any
57> =
58 // Distribute O if O is a union type
59 O extends object
60 ? MakeAttrsOptional<C, O, A> & WithChildrenIfReactComponentClass<C>
61 : never;
62
63// Because of React typing quirks, when getting props from a React.ComponentClass,
64// we need to manually add a `children` field.
65// See https://github.com/DefinitelyTyped/DefinitelyTyped/pull/31945
66// and https://github.com/DefinitelyTyped/DefinitelyTyped/pull/32843
67type WithChildrenIfReactComponentClass<
68 C extends keyof string | React.ComponentType<any>
69> = C extends React.ComponentClass<any>
70 ? { children?: React.ReactNode | undefined }
71 : {};
72
73type StyledComponentPropsWithAs<
74 C extends keyof string | React.ComponentType<any>,
75 O extends object,
76 A extends keyof any
77> = StyledComponentProps<C, O, A> & { as?: C | undefined };
78
79// abuse Pick to strip the call signature from ForwardRefExoticComponent
80type ForwardRefExoticBase<P> = Pick<
81 React.ForwardRefExoticComponent<P>,
82 keyof React.ForwardRefExoticComponent<any>
83>;
84
85export interface StyledComponent<
86 C extends keyof JSX.IntrinsicElements | React.ComponentType<any>,
87 O extends object = {},
88 A extends keyof any = never
89> extends ForwardRefExoticBase<StyledComponentProps<C, O, A>> {
90 // add our own fake call signature to implement the polymorphic 'as' prop
91 (props: StyledComponentProps<C, O, A> & { as?: never }): React.ReactElement<
92 StyledComponentProps<C, O, A>
93 >;
94 <AsC extends string | React.ComponentType<any> = C>(
95 props: StyledComponentPropsWithAs<AsC, O, A>,
96 ): React.ReactElement<StyledComponentPropsWithAs<AsC, O, A>>;
97
98 withComponent<WithC extends string | React.ComponentType<any>>(
99 component: WithC,
100 ): StyledComponent<WithC, O>;
101}
102
103export type StyledComponentPropsWithRef<
104 C extends string | React.ComponentType<any>
105> = React.ComponentPropsWithRef<C>;
106
107type Attrs<P, A extends Partial<P>> = ((props: P) => A) | A;
108
109export interface StyledFunction<
110 C extends string | React.ComponentType<any>,
111 O extends object = {},
112 A extends keyof any = never
113> {
114 (...rest: any[]): StyledComponent<C, O, A>;
115 // tslint:disable-next-line:no-unnecessary-generics
116 <U extends object>(...rest: any[]): StyledComponent<C, O & U, A>;
117
118 attrs<
119 U extends object,
120 NewA extends Partial<StyledComponentPropsWithRef<C> & U> & {
121 [others: string]: any;
122 } = Partial<StyledComponentPropsWithRef<C> & U>
123 >(
124 provideProps: Attrs<
125 ReactDefaultizedProps<C, React.ComponentPropsWithRef<C>> & U,
126 NewA
127 >,
128 ): StyledFunction<C, O & NewA, A | keyof NewA>;
129}
130
131export type StyledTags = {
132 readonly [TTag in IntrinsicElementsKeys]: StyledFunction<TTag>;
133};
134
135export interface StyledOptions {
136 allowAs?: boolean | undefined;
137}
138
139export type mapper<TInner, TOuter> = (input: TInner) => TOuter;
140
141export interface CreateStyled extends StyledTags {
142 <C extends IntrinsicElementsKeys | React.ComponentType<any>>(
143 component: C,
144 options?: StyledOptions,
145 ): StyledFunction<C>;
146
147 <
148 C extends IntrinsicElementsKeys | React.ComponentType<any>,
149 OtherProps extends object
150 >(
151 component: C,
152 options?: StyledOptions | undefined,
153 ): StyledFunction<C, OtherProps>;
154}
155
156declare const styled: CreateStyled;
157
158export function css(template: TemplateStringsArray, ...args: any[]): string;
159
160export function stylesheet(
161 template: TemplateStringsArray,
162 ...args: any[]
163): Record<string, string>;
164
165export default styled;