diff --git a/react/react-addons-test-utils.d.ts b/react/react-addons-test-utils.d.ts index 0c29507a0..efe8392a1 100644 --- a/react/react-addons-test-utils.d.ts +++ b/react/react-addons-test-utils.d.ts @@ -104,10 +104,17 @@ declare namespace __React { export function mockComponent( mocked: MockedComponentClass, mockTagName?: string): typeof TestUtils; - export function isElementOfType( - element: ReactElement, type: ReactType): boolean; - export function isDOMComponent(instance: ReactInstance): boolean; - export function isCompositeComponent(instance: ReactInstance): boolean; + export function isElementOfType( + element: ReactElement, type: string): element is ReactHTMLElement; + export function isElementOfType

( + element: ReactElement, type: string): element is DOMElement; + export function isElementOfType

( + element: ReactElement, type: SFC

): element is SFCElement

; + export function isElementOfType, C extends ComponentClass

>( + element: ReactElement, type: ClassType): element is CElement; + + export function isDOMComponent(instance: ReactInstance): instance is Element; + export function isCompositeComponent(instance: ReactInstance): instance is Component; export function isCompositeComponentWithType( instance: ReactInstance, type: ComponentClass): boolean; diff --git a/react/react-tests.ts b/react/react-tests.ts index 9a3ac5f50..aa485b2ae 100644 --- a/react/react-tests.ts +++ b/react/react-tests.ts @@ -220,9 +220,12 @@ domNode = ReactDOM.findDOMNode(domNode); // React Elements // -------------------------------------------------------------------------- -var type = element.type; +var type: React.ComponentClass = element.type; var elementProps: Props = element.props; -var key = element.key; +var key: React.Key = element.key; + +var t: React.ReactType; +var name = typeof t === "string" ? t : t.displayName; // // React Components @@ -543,6 +546,20 @@ var foundComponent: ModernComponent = TestUtils.findRenderedComponentWithType( var foundComponents: ModernComponent[] = TestUtils.scryRenderedComponentsWithType( inst, ModernComponent); +// ReactTestUtils custom type guards + +var emptyElement: React.ReactElement<{}>; +if (TestUtils.isElementOfType(emptyElement, StatelessComponent)) { + emptyElement.props.foo; +} + +var anyInstance: Element | React.Component; +if (TestUtils.isDOMComponent(anyInstance)) { + anyInstance.getAttribute("className"); +} else if (TestUtils.isCompositeComponent(anyInstance)) { + anyInstance.props; +} + // // TransitionGroup addon // -------------------------------------------------------------------------- diff --git a/react/react.d.ts b/react/react.d.ts index 927a06ffa..c06081019 100644 --- a/react/react.d.ts +++ b/react/react.d.ts @@ -174,12 +174,12 @@ declare namespace __React { contextTypes?: ValidationMap; childContextTypes?: ValidationMap; defaultProps?: P; + displayName?: string; } interface ClassicComponentClass

extends ComponentClass

{ new(props?: P, context?: any): ClassicComponent; getDefaultProps?(): P; - displayName?: string; } //