export as namespace preact; import { JSXInternal } from './jsx'; export import JSX = JSXInternal; // // Preact Virtual DOM // ----------------------------------- export interface VNode

{ type: ComponentType

| string; props: P & { children: ComponentChildren }; key: Key; /** * ref is not guaranteed by React.ReactElement, for compatibility reasons * with popular react libs we define it as optional too */ ref?: Ref | null; /** * The time this `vnode` started rendering. Will only be set when * the devtools are attached. * Default value: `0` */ startTime?: number; /** * The time that the rendering of this `vnode` was completed. Will only be * set when the devtools are attached. * Default value: `-1` */ endTime?: number; } // // Preact Component interface // ----------------------------------- export type Key = string | number | any; export type RefObject = { current: T | null }; export type RefCallback = (instance: T | null) => void; export type Ref = RefObject | RefCallback; export type ComponentChild = | VNode | object | string | number | bigint | boolean | null | undefined; export type ComponentChildren = ComponentChild[] | ComponentChild; export interface Attributes { key?: Key; jsx?: boolean; } export interface ClassAttributes extends Attributes { ref?: Ref; } export interface PreactDOMAttributes { children?: ComponentChildren; dangerouslySetInnerHTML?: { __html: string; }; } export interface ErrorInfo { componentStack?: string; } export type RenderableProps = P & Readonly }>; export type ComponentType

= ComponentClass

| FunctionComponent

; export type ComponentFactory

= ComponentType

; export type ComponentProps< C extends ComponentType | keyof JSXInternal.IntrinsicElements > = C extends ComponentType ? P : C extends keyof JSXInternal.IntrinsicElements ? JSXInternal.IntrinsicElements[C] : never; export interface FunctionComponent

{ (props: RenderableProps

, context?: any): VNode | null; displayName?: string; defaultProps?: Partial

; } export interface FunctionalComponent

extends FunctionComponent

{} export interface ComponentClass

{ new (props: P, context?: any): Component; displayName?: string; defaultProps?: Partial

; contextType?: Context; getDerivedStateFromProps?( props: Readonly

, state: Readonly ): Partial | null; getDerivedStateFromError?(error: any): Partial | null; } export interface ComponentConstructor

extends ComponentClass {} // Type alias for a component instance considered generally, whether stateless or stateful. export type AnyComponent

= | FunctionComponent

| Component; export interface Component

{ componentWillMount?(): void; componentDidMount?(): void; componentWillUnmount?(): void; getChildContext?(): object; componentWillReceiveProps?(nextProps: Readonly

, nextContext: any): void; shouldComponentUpdate?( nextProps: Readonly

, nextState: Readonly, nextContext: any ): boolean; componentWillUpdate?( nextProps: Readonly

, nextState: Readonly, nextContext: any ): void; getSnapshotBeforeUpdate?(oldProps: Readonly

, oldState: Readonly): any; componentDidUpdate?( previousProps: Readonly

, previousState: Readonly, snapshot: any ): void; componentDidCatch?(error: any, errorInfo: ErrorInfo): void; } export abstract class Component { constructor(props?: P, context?: any); static displayName?: string; static defaultProps?: any; static contextType?: Context; // Static members cannot reference class type parameters. This is not // supported in TypeScript. Reusing the same type arguments from `Component` // will lead to an impossible state where one cannot satisfy the type // constraint under no circumstances, see #1356.In general type arguments // seem to be a bit buggy and not supported well at the time of this // writing with TS 3.3.3333. static getDerivedStateFromProps?( props: Readonly, state: Readonly ): object | null; static getDerivedStateFromError?(error: any): object | null; state: Readonly; props: RenderableProps

; context: any; base?: Element | Text; // From https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e836acc75a78cf0655b5dfdbe81d69fdd4d8a252/types/react/index.d.ts#L402 // // We MUST keep setState() as a unified signature because it allows proper checking of the method return type. // // See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18365#issuecomment-351013257 setState( state: | (( prevState: Readonly, props: Readonly

) => Pick | Partial | null) | (Pick | Partial | null), callback?: () => void ): void; forceUpdate(callback?: () => void): void; abstract render( props?: RenderableProps

, state?: Readonly, context?: any ): ComponentChild; } // // Preact createElement // ----------------------------------- export function createElement( type: string, props: | (JSXInternal.HTMLAttributes & JSXInternal.SVGAttributes & Record) | null, ...children: ComponentChildren[] ): VNode; export function createElement

( type: ComponentType

, props: (Attributes & P) | null, ...children: ComponentChildren[] ): VNode; export namespace createElement { export import JSX = JSXInternal; } export function h( type: string, props: | (JSXInternal.HTMLAttributes & JSXInternal.SVGAttributes & Record) | null, ...children: ComponentChildren[] ): VNode; export function h

( type: ComponentType

, props: (Attributes & P) | null, ...children: ComponentChildren[] ): VNode; export namespace h { export import JSX = JSXInternal; } // // Preact render // ----------------------------------- export function render( vnode: ComponentChild, parent: Element | Document | ShadowRoot | DocumentFragment, replaceNode?: Element | Text ): void; export function hydrate( vnode: ComponentChild, parent: Element | Document | ShadowRoot | DocumentFragment ): void; export function cloneElement( vnode: VNode, props?: any, ...children: ComponentChildren[] ): VNode; export function cloneElement

( vnode: VNode

, props?: any, ...children: ComponentChildren[] ): VNode

; // // Preact Built-in Components // ----------------------------------- // TODO: Revisit what the public type of this is... export const Fragment: FunctionComponent<{}>; // // Preact options // ----------------------------------- /** * Global options for preact */ export interface Options { /** Attach a hook that is invoked whenever a VNode is created. */ vnode?(vnode: VNode): void; /** Attach a hook that is invoked immediately before a vnode is unmounted. */ unmount?(vnode: VNode): void; /** Attach a hook that is invoked after a vnode has rendered. */ diffed?(vnode: VNode): void; event?(e: Event): any; requestAnimationFrame?(callback: () => void): void; debounceRendering?(cb: () => void): void; useDebugValue?(value: string | number): void; _addHookName?(name: string | number): void; __suspenseDidResolve?(vnode: VNode, cb: () => void): void; // __canSuspenseResolve?(vnode: VNode, cb: () => void): void; } export const options: Options; // // Preact helpers // ----------------------------------- export function createRef(): RefObject; export function toChildArray( children: ComponentChildren ): Array; export function isValidElement(vnode: any): vnode is VNode; // // Context // ----------------------------------- export interface Consumer extends FunctionComponent<{ children: (value: T) => ComponentChildren; }> {} export interface PreactConsumer extends Consumer {} export interface Provider extends FunctionComponent<{ value: T; children: ComponentChildren; }> {} export interface PreactProvider extends Provider {} export type ContextType> = C extends Context ? T : never; export interface Context { Consumer: Consumer; Provider: Provider; displayName?: string; } export interface PreactContext extends Context {} export function createContext(defaultValue: T): Context;