// TypeScript Version: 3.0
// changed from: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/styled-components
/* eslint-disable */
import * as React from 'react';
export type IntrinsicElementsKeys = keyof JSX.IntrinsicElements;
// Any prop that has a default prop becomes optional, but its type is unchanged
// Undeclared default props are augmented into the resulting allowable attributes
// If declared props have indexed properties, ignore default props entirely as keyof gets widened
// Wrap in an outer-level conditional type to allow distribution over props that are unions
type Defaultize
= P extends any
? string extends keyof P
? P
: Pick
> &
Partial>> &
Partial>>
: never;
type ReactDefaultizedProps = C extends { defaultProps: infer D }
? Defaultize
: P;
type MakeAttrsOptional<
C extends string | React.ComponentType,
O extends object,
A extends keyof any
> = Omit<
ReactDefaultizedProps<
C,
React.ComponentPropsWithRef<
C extends IntrinsicElementsKeys | React.ComponentType ? C : never
>
> &
O,
A
> &
Partial<
Pick<
React.ComponentPropsWithRef<
C extends IntrinsicElementsKeys | React.ComponentType ? C : never
> &
O,
A
>
>;
export type StyledComponentProps<
// The Component from whose props are derived
C extends keyof string | React.ComponentType,
// The other props added by the template
O extends object,
// The props that are made optional by .attrs
A extends keyof any
> =
// Distribute O if O is a union type
O extends object
? MakeAttrsOptional & WithChildrenIfReactComponentClass
: never;
// Because of React typing quirks, when getting props from a React.ComponentClass,
// we need to manually add a `children` field.
// See https://github.com/DefinitelyTyped/DefinitelyTyped/pull/31945
// and https://github.com/DefinitelyTyped/DefinitelyTyped/pull/32843
type WithChildrenIfReactComponentClass<
C extends keyof string | React.ComponentType
> = C extends React.ComponentClass
? { children?: React.ReactNode | undefined }
: {};
type StyledComponentPropsWithAs<
C extends keyof string | React.ComponentType,
O extends object,
A extends keyof any
> = StyledComponentProps & { as?: C | undefined };
// abuse Pick to strip the call signature from ForwardRefExoticComponent
type ForwardRefExoticBase = Pick<
React.ForwardRefExoticComponent
,
keyof React.ForwardRefExoticComponent
>;
export interface StyledComponent<
C extends keyof JSX.IntrinsicElements | React.ComponentType,
O extends object = {},
A extends keyof any = never
> extends ForwardRefExoticBase> {
// add our own fake call signature to implement the polymorphic 'as' prop
(props: StyledComponentProps & { as?: never }): React.ReactElement<
StyledComponentProps
>;
= C>(
props: StyledComponentPropsWithAs,
): React.ReactElement>;
withComponent>(
component: WithC,
): StyledComponent;
}
export type StyledComponentPropsWithRef<
C extends string | React.ComponentType
> = React.ComponentPropsWithRef;
type Attrs> = ((props: P) => A) | A;
export interface StyledFunction<
C extends string | React.ComponentType,
O extends object = {},
A extends keyof any = never
> {
(...rest: any[]): StyledComponent;
// tslint:disable-next-line:no-unnecessary-generics
(...rest: any[]): StyledComponent;
attrs<
U extends object,
NewA extends Partial & U> & {
[others: string]: any;
} = Partial & U>
>(
provideProps: Attrs<
ReactDefaultizedProps> & U,
NewA
>,
): StyledFunction;
}
export type StyledTags = {
readonly [TTag in IntrinsicElementsKeys]: StyledFunction;
};
export interface StyledOptions {
allowAs?: boolean | undefined;
}
export type mapper = (input: TInner) => TOuter;
export interface CreateStyled extends StyledTags {
>(
component: C,
options?: StyledOptions,
): StyledFunction;
<
C extends IntrinsicElementsKeys | React.ComponentType,
OtherProps extends object
>(
component: C,
options?: StyledOptions | undefined,
): StyledFunction;
}
declare const styled: CreateStyled;
export function css(template: TemplateStringsArray, ...args: any[]): string;
export function stylesheet(
template: TemplateStringsArray,
...args: any[]
): Record;
export default styled;