From 084926e23accedcbf700bf480e38abdeabcd971e Mon Sep 17 00:00:00 2001 From: phiresky Date: Sun, 3 Jul 2016 20:13:58 +0200 Subject: [PATCH] react: Add target type to events this allows getting the actual html element type from events. Example: ```ts render() { return console.log(e.target.value)}/> } ``` Previously you would have to cast the target manually: ```ts render() { return console.log((e.target as HTMLInputElement).value)}/> } ``` --- react-dom/index.d.ts | 4 +- react/index.d.ts | 204 +++++++++++++++++++++---------------------- react/react-tests.ts | 5 +- 3 files changed, 108 insertions(+), 105 deletions(-) diff --git a/react-dom/index.d.ts b/react-dom/index.d.ts index 7587458e31..f55edda14d 100644 --- a/react-dom/index.d.ts +++ b/react-dom/index.d.ts @@ -16,7 +16,7 @@ declare namespace ReactDOM { function findDOMNode(instance: ReactInstance): E; function findDOMNode(instance: ReactInstance): Element; - function render

( + function render

, T extends Element>( element: DOMElement, container: Element, callback?: (element: T) => any): T; @@ -41,7 +41,7 @@ declare namespace ReactDOM { function unstable_batchedUpdates(callback: (a: A) => any, a: A): void; function unstable_batchedUpdates(callback: () => any): void; - function unstable_renderSubtreeIntoContainer

( + function unstable_renderSubtreeIntoContainer

, T extends Element>( parentComponent: Component, element: DOMElement, container: Element, diff --git a/react/index.d.ts b/react/index.d.ts index 9e00e19d82..d7974d56ca 100644 --- a/react/index.d.ts +++ b/react/index.d.ts @@ -43,15 +43,15 @@ declare namespace React { type ClassicElement

= CElement>; - interface DOMElement

extends ReactElement

{ + interface DOMElement

, T extends Element> extends ReactElement

{ type: string; ref: Ref; } - interface ReactHTMLElement extends DOMElement { + interface ReactHTMLElement extends DOMElement, T> { } - interface ReactSVGElement extends DOMElement { + interface ReactSVGElement extends DOMElement, SVGElement> { } // @@ -73,14 +73,14 @@ declare namespace React { type CFactory> = ComponentFactory; type ClassicFactory

= CFactory>; - interface DOMFactory

{ + interface DOMFactory

, T extends Element> { (props?: P & ClassAttributes, ...children: ReactNode[]): DOMElement; } - interface HTMLFactory extends DOMFactory { + interface HTMLFactory extends DOMFactory, T> { } - interface SVGFactory extends DOMFactory { + interface SVGFactory extends DOMFactory, SVGElement> { } // @@ -101,7 +101,7 @@ declare namespace React { function createClass(spec: ComponentSpec): ClassicComponentClass

; - function createFactory

( + function createFactory

, T extends Element>( type: string): DOMFactory; function createFactory

(type: SFC

): SFCFactory

; function createFactory

( @@ -110,7 +110,7 @@ declare namespace React { type: ClassType): CFactory; function createFactory

(type: ComponentClass

| SFC

): Factory

; - function createElement

( + function createElement

, T extends Element>( type: string, props?: P & ClassAttributes, ...children: ReactNode[]): DOMElement; @@ -131,7 +131,7 @@ declare namespace React { props?: P & Attributes, ...children: ReactNode[]): ReactElement

; - function cloneElement

( + function cloneElement

, T extends Element>( element: DOMElement, props?: P & ClassAttributes, ...children: ReactNode[]): DOMElement; @@ -267,41 +267,41 @@ declare namespace React { // Event System // ---------------------------------------------------------------------- - interface SyntheticEvent { + interface SyntheticEvent { bubbles: boolean; - cancelable: boolean; currentTarget: EventTarget; + cancelable: boolean; defaultPrevented: boolean; eventPhase: number; isTrusted: boolean; nativeEvent: Event; preventDefault(): void; stopPropagation(): void; - target: EventTarget; + target: EventTarget & T; timeStamp: Date; type: string; } - interface ClipboardEvent extends SyntheticEvent { + interface ClipboardEvent extends SyntheticEvent { clipboardData: DataTransfer; } - interface CompositionEvent extends SyntheticEvent { + interface CompositionEvent extends SyntheticEvent { data: string; } - interface DragEvent extends SyntheticEvent { + interface DragEvent extends SyntheticEvent { dataTransfer: DataTransfer; } - interface FocusEvent extends SyntheticEvent { + interface FocusEvent extends SyntheticEvent { relatedTarget: EventTarget; } - interface FormEvent extends SyntheticEvent { + interface FormEvent extends SyntheticEvent { } - interface KeyboardEvent extends SyntheticEvent { + interface KeyboardEvent extends SyntheticEvent { altKey: boolean; charCode: number; ctrlKey: boolean; @@ -316,7 +316,7 @@ declare namespace React { which: number; } - interface MouseEvent extends SyntheticEvent { + interface MouseEvent extends SyntheticEvent { altKey: boolean; button: number; buttons: number; @@ -333,7 +333,7 @@ declare namespace React { shiftKey: boolean; } - interface TouchEvent extends SyntheticEvent { + interface TouchEvent extends SyntheticEvent { altKey: boolean; changedTouches: TouchList; ctrlKey: boolean; @@ -344,12 +344,12 @@ declare namespace React { touches: TouchList; } - interface UIEvent extends SyntheticEvent { + interface UIEvent extends SyntheticEvent { detail: number; view: AbstractView; } - interface WheelEvent extends SyntheticEvent { + interface WheelEvent extends SyntheticEvent { deltaMode: number; deltaX: number; deltaY: number; @@ -360,22 +360,22 @@ declare namespace React { // Event Handler Types // ---------------------------------------------------------------------- - interface EventHandler { + interface EventHandler> { (event: E): void; } - type ReactEventHandler = EventHandler; + type ReactEventHandler = EventHandler>; - type ClipboardEventHandler = EventHandler; - type CompositionEventHandler = EventHandler; - type DragEventHandler = EventHandler; - type FocusEventHandler = EventHandler; - type FormEventHandler = EventHandler; - type KeyboardEventHandler = EventHandler; - type MouseEventHandler = EventHandler; - type TouchEventHandler = EventHandler; - type UIEventHandler = EventHandler; - type WheelEventHandler = EventHandler; + type ClipboardEventHandler = EventHandler>; + type CompositionEventHandler = EventHandler>; + type DragEventHandler = EventHandler>; + type FocusEventHandler = EventHandler>; + type FormEventHandler = EventHandler>; + type KeyboardEventHandler = EventHandler>; + type MouseEventHandler = EventHandler>; + type TouchEventHandler = EventHandler>; + type UIEventHandler = EventHandler>; + type WheelEventHandler = EventHandler>; // // Props / DOM Attributes @@ -401,104 +401,104 @@ declare namespace React { ref?: Ref; } - interface HTMLProps extends HTMLAttributes, ClassAttributes { + interface HTMLProps extends HTMLAttributes, ClassAttributes { } - interface SVGProps extends SVGAttributes, ClassAttributes { + interface SVGProps extends SVGAttributes, ClassAttributes { } - interface DOMAttributes { + interface DOMAttributes { children?: ReactNode; dangerouslySetInnerHTML?: { __html: string; }; // Clipboard Events - onCopy?: ClipboardEventHandler; - onCut?: ClipboardEventHandler; - onPaste?: ClipboardEventHandler; + onCopy?: ClipboardEventHandler; + onCut?: ClipboardEventHandler; + onPaste?: ClipboardEventHandler; // Composition Events - onCompositionEnd?: CompositionEventHandler; - onCompositionStart?: CompositionEventHandler; - onCompositionUpdate?: CompositionEventHandler; + onCompositionEnd?: CompositionEventHandler; + onCompositionStart?: CompositionEventHandler; + onCompositionUpdate?: CompositionEventHandler; // Focus Events - onFocus?: FocusEventHandler; - onBlur?: FocusEventHandler; + onFocus?: FocusEventHandler; + onBlur?: FocusEventHandler; // Form Events - onChange?: FormEventHandler; - onInput?: FormEventHandler; - onSubmit?: FormEventHandler; + onChange?: FormEventHandler; + onInput?: FormEventHandler; + onSubmit?: FormEventHandler; // Image Events - onLoad?: ReactEventHandler; - onError?: ReactEventHandler; // also a Media Event + onLoad?: ReactEventHandler; + onError?: ReactEventHandler; // also a Media Event // Keyboard Events - onKeyDown?: KeyboardEventHandler; - onKeyPress?: KeyboardEventHandler; - onKeyUp?: KeyboardEventHandler; + onKeyDown?: KeyboardEventHandler; + onKeyPress?: KeyboardEventHandler; + onKeyUp?: KeyboardEventHandler; // Media Events - onAbort?: ReactEventHandler; - onCanPlay?: ReactEventHandler; - onCanPlayThrough?: ReactEventHandler; - onDurationChange?: ReactEventHandler; - onEmptied?: ReactEventHandler; - onEncrypted?: ReactEventHandler; - onEnded?: ReactEventHandler; - onLoadedData?: ReactEventHandler; - onLoadedMetadata?: ReactEventHandler; - onLoadStart?: ReactEventHandler; - onPause?: ReactEventHandler; - onPlay?: ReactEventHandler; - onPlaying?: ReactEventHandler; - onProgress?: ReactEventHandler; - onRateChange?: ReactEventHandler; - onSeeked?: ReactEventHandler; - onSeeking?: ReactEventHandler; - onStalled?: ReactEventHandler; - onSuspend?: ReactEventHandler; - onTimeUpdate?: ReactEventHandler; - onVolumeChange?: ReactEventHandler; - onWaiting?: ReactEventHandler; + onAbort?: ReactEventHandler; + onCanPlay?: ReactEventHandler; + onCanPlayThrough?: ReactEventHandler; + onDurationChange?: ReactEventHandler; + onEmptied?: ReactEventHandler; + onEncrypted?: ReactEventHandler; + onEnded?: ReactEventHandler; + onLoadedData?: ReactEventHandler; + onLoadedMetadata?: ReactEventHandler; + onLoadStart?: ReactEventHandler; + onPause?: ReactEventHandler; + onPlay?: ReactEventHandler; + onPlaying?: ReactEventHandler; + onProgress?: ReactEventHandler; + onRateChange?: ReactEventHandler; + onSeeked?: ReactEventHandler; + onSeeking?: ReactEventHandler; + onStalled?: ReactEventHandler; + onSuspend?: ReactEventHandler; + onTimeUpdate?: ReactEventHandler; + onVolumeChange?: ReactEventHandler; + onWaiting?: ReactEventHandler; // MouseEvents - onClick?: MouseEventHandler; - onContextMenu?: MouseEventHandler; - onDoubleClick?: MouseEventHandler; - onDrag?: DragEventHandler; - onDragEnd?: DragEventHandler; - onDragEnter?: DragEventHandler; - onDragExit?: DragEventHandler; - onDragLeave?: DragEventHandler; - onDragOver?: DragEventHandler; - onDragStart?: DragEventHandler; - onDrop?: DragEventHandler; - onMouseDown?: MouseEventHandler; - onMouseEnter?: MouseEventHandler; - onMouseLeave?: MouseEventHandler; - onMouseMove?: MouseEventHandler; - onMouseOut?: MouseEventHandler; - onMouseOver?: MouseEventHandler; - onMouseUp?: MouseEventHandler; + onClick?: MouseEventHandler; + onContextMenu?: MouseEventHandler; + onDoubleClick?: MouseEventHandler; + onDrag?: DragEventHandler; + onDragEnd?: DragEventHandler; + onDragEnter?: DragEventHandler; + onDragExit?: DragEventHandler; + onDragLeave?: DragEventHandler; + onDragOver?: DragEventHandler; + onDragStart?: DragEventHandler; + onDrop?: DragEventHandler; + onMouseDown?: MouseEventHandler; + onMouseEnter?: MouseEventHandler; + onMouseLeave?: MouseEventHandler; + onMouseMove?: MouseEventHandler; + onMouseOut?: MouseEventHandler; + onMouseOver?: MouseEventHandler; + onMouseUp?: MouseEventHandler; // Selection Events - onSelect?: ReactEventHandler; + onSelect?: ReactEventHandler; // Touch Events - onTouchCancel?: TouchEventHandler; - onTouchEnd?: TouchEventHandler; - onTouchMove?: TouchEventHandler; - onTouchStart?: TouchEventHandler; + onTouchCancel?: TouchEventHandler; + onTouchEnd?: TouchEventHandler; + onTouchMove?: TouchEventHandler; + onTouchStart?: TouchEventHandler; // UI Events - onScroll?: UIEventHandler; + onScroll?: UIEventHandler; // Wheel Events - onWheel?: WheelEventHandler; + onWheel?: WheelEventHandler; } // This interface is not complete. Only properties accepting @@ -1886,7 +1886,7 @@ declare namespace React { [propertyName: string]: any; } - interface HTMLAttributes extends DOMAttributes { + interface HTMLAttributes extends DOMAttributes { // React-specific Attributes defaultChecked?: boolean; defaultValue?: string | string[]; @@ -2042,7 +2042,7 @@ declare namespace React { [key: string]: any; } - interface SVGAttributes extends HTMLAttributes { + interface SVGAttributes extends HTMLAttributes { clipPath?: string; cx?: number | string; cy?: number | string; diff --git a/react/react-tests.ts b/react/react-tests.ts index 9fc0db1676..088f1eb164 100644 --- a/react/react-tests.ts +++ b/react/react-tests.ts @@ -116,8 +116,11 @@ class ModernComponent extends React.Component render() { return React.DOM.div(null, React.DOM.input({ - ref: input => this._input = input, + ref: input => this._input = input, value: this.state.inputValue + }), + React.DOM.input({ + onChange: event => console.log(event.target.value) })); }