From 0a2007983a7d9812fce2f1cd6e4acdd1aec25727 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 26 Jun 2017 11:21:36 -0700 Subject: [PATCH 1/3] createElement splits SVG/HTML props based on type parameter This is required for 2.4 to avoid a weak type error since DOMAttributes is a weak type. --- types/react/index.d.ts | 16 +++++++++++----- types/react/test/index.ts | 2 ++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/types/react/index.d.ts b/types/react/index.d.ts index b0356ae4b6..99e9de616f 100644 --- a/types/react/index.d.ts +++ b/types/react/index.d.ts @@ -136,8 +136,12 @@ declare namespace React { type: ClassType): CFactory; function createFactory

(type: ComponentClass

): Factory

; - function createElement

, T extends Element>( - type: string, + function createElement

, T extends Element>( + type: keyof ReactHTML, + props?: ClassAttributes & P, + ...children: ReactNode[]): DOMElement; + function createElement

, T extends Element>( + type: keyof ReactSVG, props?: ClassAttributes & P, ...children: ReactNode[]): DOMElement; function createElement

( @@ -2526,8 +2530,7 @@ declare namespace React { // React.DOM // ---------------------------------------------------------------------- - interface ReactDOM { - // HTML + interface ReactHTML { a: HTMLFactory; abbr: HTMLFactory; address: HTMLFactory; @@ -2641,8 +2644,9 @@ declare namespace React { "var": HTMLFactory; video: HTMLFactory; wbr: HTMLFactory; + } - // SVG + interface ReactSVG { svg: SVGFactory; animate: SVGFactory; circle: SVGFactory; @@ -2666,6 +2670,8 @@ declare namespace React { use: SVGFactory; } + interface ReactDOM extends ReactHTML, ReactSVG { } + // // React.PropTypes // ---------------------------------------------------------------------- diff --git a/types/react/test/index.ts b/types/react/test/index.ts index 77e46e49aa..27acc07d34 100644 --- a/types/react/test/index.ts +++ b/types/react/test/index.ts @@ -190,6 +190,8 @@ var classicElement: React.ClassicElement = React.createElement(ClassicComponent, props); var domElement: React.ReactHTMLElement = React.createElement("div"); +var htmlElement = React.createElement("input", { type: "text" }); +var svgElement = React.createElement("svg", { accentHeight: 12 }); // React.cloneElement var clonedElement: React.CElement = From e6a401f7dafb11114e07cf6a4b2c8528da639452 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 26 Jun 2017 14:48:23 -0700 Subject: [PATCH 2/3] React.createElement has more specific return types --- types/react/index.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/types/react/index.d.ts b/types/react/index.d.ts index 99e9de616f..c70dbaa3fa 100644 --- a/types/react/index.d.ts +++ b/types/react/index.d.ts @@ -136,14 +136,14 @@ declare namespace React { type: ClassType): CFactory; function createFactory

(type: ComponentClass

): Factory

; - function createElement

, T extends Element>( + function createElement

, T extends HTMLElement>( type: keyof ReactHTML, props?: ClassAttributes & P, - ...children: ReactNode[]): DOMElement; + ...children: ReactNode[]): ReactHTMLElement; function createElement

, T extends Element>( type: keyof ReactSVG, props?: ClassAttributes & P, - ...children: ReactNode[]): DOMElement; + ...children: ReactNode[]): ReactSVGElement; function createElement

( type: SFC

, props?: Attributes & P, From b5eb45232a190879384e731c8b57fcf0b7cc0d92 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 26 Jun 2017 15:31:09 -0700 Subject: [PATCH 3/3] Better constraint for React.createElement for SVG --- types/react/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/react/index.d.ts b/types/react/index.d.ts index c70dbaa3fa..577959ae7b 100644 --- a/types/react/index.d.ts +++ b/types/react/index.d.ts @@ -140,7 +140,7 @@ declare namespace React { type: keyof ReactHTML, props?: ClassAttributes & P, ...children: ReactNode[]): ReactHTMLElement; - function createElement

, T extends Element>( + function createElement

, T extends SVGElement>( type: keyof ReactSVG, props?: ClassAttributes & P, ...children: ReactNode[]): ReactSVGElement;