DefinitelyTyped/types/superfine/index.d.ts
jameswilddev 7bd3a9ed10
Superfine amendments (#45540)
* Add superfine types.

* Add TSX coverage.

* Add missing "key" property.

* Superfine looks for a SVG element to start creating SVG elements.  This is now enforced through types.

* Fix lint.

* Fix tests using HTML tags in a SVG context.

* Allow empty or single child vnodes.

* Allow strings in JSX.

* Refactor types.

* Lint.
2020-07-07 14:04:25 -07:00

60 lines
1.9 KiB
TypeScript

// Type definitions for superfine 7.0
// Project: https://github.com/jorgebucaran/superfine#readme
// Definitions by: jameswilddev <https://github.com/jameswilddev>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// Minimum TypeScript Version: 3.1
export {};
type HtmlOrSvgElementTagNameMap = HTMLElementTagNameMap & Pick<SVGElementTagNameMap, Exclude<keyof SVGElementTagNameMap, keyof HTMLElementTagNameMap>>;
export type Props<TTagName extends keyof HtmlOrSvgElementTagNameMap> = {
readonly [TAttributeName in keyof HtmlOrSvgElementTagNameMap[TTagName]]?: HtmlOrSvgElementTagNameMap[TTagName][TAttributeName]
} & {
readonly key?: number | string
};
export interface VNode<TTagName extends keyof HtmlOrSvgElementTagNameMap> {
readonly name: TTagName;
}
type Child<TTagName extends keyof HtmlOrSvgElementTagNameMap> =
| string
| VNode<TTagName>;
type Children<TTagName extends keyof HtmlOrSvgElementTagNameMap> =
| Child<TTagName>
| ReadonlyArray<Child<TTagName>>;
export function h(
tagName: "svg",
props: Props<"svg">,
children?: Children<keyof SVGElementTagNameMap>
): VNode<"svg">;
export function h<TTagName extends keyof HTMLElementTagNameMap>(
tagName: TTagName,
props: Props<TTagName>,
children?: Children<(keyof HTMLElementTagNameMap) | "svg">
): VNode<TTagName>;
export function h<TTagName extends keyof SVGElementTagNameMap>(
tagName: TTagName,
props: Props<TTagName>,
children?: Children<keyof SVGElementTagNameMap>
): VNode<TTagName>;
export function patch<TTagName extends keyof HtmlOrSvgElementTagNameMap>(
rootElement: HtmlOrSvgElementTagNameMap[TTagName],
vNode: VNode<TTagName>
): void;
declare global {
namespace JSX {
interface Element extends VNode<keyof HtmlOrSvgElementTagNameMap> {}
type IntrinsicElements = {
readonly [TTagName in keyof HtmlOrSvgElementTagNameMap]: Props<TTagName>
};
}
}