diff --git a/types/recompose/index.d.ts b/types/recompose/index.d.ts index a3f1a5625e..7a7bf3a411 100644 --- a/types/recompose/index.d.ts +++ b/types/recompose/index.d.ts @@ -1,10 +1,11 @@ -// Type definitions for Recompose 0.26 +// Type definitions for Recompose 0.27 // Project: https://github.com/acdlite/recompose // Definitions by: Iskander Sierra // Samuel DeSota // Curtis Layne // Rasmus Eneman // Lucas Terra +// Brian Adams // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.8 @@ -269,19 +270,19 @@ declare module 'recompose' { // Static property helpers: https://github.com/acdlite/recompose/blob/master/docs/API.md#static-property-helpers // setStatic: https://github.com/acdlite/recompose/blob/master/docs/API.md#setStatic - export function setStatic( + export function setStatic( key: string, value: any - ): ComponentEnhancer; + ): (component: T) => T; // setPropTypes: https://github.com/acdlite/recompose/blob/master/docs/API.md#setPropTypes - export function setPropTypes( - propTypes: ValidationMap - ): ComponentEnhancer; + export function setPropTypes

( + propTypes: ValidationMap

+ ): >(component: T) => T; // setDisplayName: https://github.com/acdlite/recompose/blob/master/docs/API.md#setDisplayName - export function setDisplayName( + export function setDisplayName( displayName: string - ): ComponentEnhancer; + ): (component: T) => T; // Utilities: https://github.com/acdlite/recompose/blob/master/docs/API.md#utilities diff --git a/types/recompose/recompose-tests.tsx b/types/recompose/recompose-tests.tsx index 9058a10f4d..4958f32e48 100644 --- a/types/recompose/recompose-tests.tsx +++ b/types/recompose/recompose-tests.tsx @@ -1,4 +1,5 @@ import * as React from "react"; +import * as PropTypes from 'prop-types'; import { // Higher-order components mapProps, withProps, withPropsOnChange, withHandlers, @@ -412,3 +413,86 @@ function testLifecycle() { } })(component) } + +function testSetStatic() { + interface Props { + foo: string; + } + + let SfcResult: React.SFC; + const SfcComp: React.SFC = (props) => (

{props.foo}
); + + let ClassResult: React.ComponentClass; + class ClassComp extends React.Component { + render() { + return (
{this.props.foo}
); + } + } + + const hoc1 = setStatic('bar', 'a string'); + const hoc2 = setStatic('bar', 5); + const hoc3 = setStatic('bar', { a: 'b' }); + + SfcResult = hoc1(SfcComp); + SfcResult = hoc2(SfcComp); + SfcResult = hoc3(SfcComp); + SfcResult = hoc1(ClassComp); // $ExpectError + + ClassResult = hoc1(ClassComp); + ClassResult = hoc2(ClassComp); + ClassResult = hoc3(ClassComp); + ClassResult = hoc1(SfcComp); // $ExpectError +} + +function testSetPropTypes() { + interface Props { + foo: string; + } + const validationMap = { + foo: PropTypes.string.isRequired + } + + let SfcResult: React.SFC; + const SfcComp: React.SFC = (props) => (
{props.foo}
); + + let ClassResult: React.ComponentClass; + class ClassComp extends React.Component { + render() { + return (
{this.props.foo}
); + } + } + + const hoc = setPropTypes(validationMap); + + SfcResult = hoc(SfcComp); + SfcResult = hoc(ClassComp); // $ExpectError + + ClassResult = hoc(ClassComp); + ClassResult = hoc(SfcComp); // $ExpectError + + SfcResult = setPropTypes({ bar: PropTypes.string })(SfcComp); // $ExpectError +} + +function testSetDisplayName() { + interface Props { + foo: string; + } + + let SfcResult: React.SFC; + const SfcComp: React.SFC = (props) => (
{props.foo}
); + + let ClassResult: React.ComponentClass; + class ClassComp extends React.Component { + render() { + return (
{this.props.foo}
); + } + } + + const hoc = setDisplayName('NewDisplayName'); + + SfcResult = hoc(SfcComp); + SfcResult = hoc(ClassComp); // $ExpectError + + ClassResult = hoc(ClassComp); + ClassResult = hoc(SfcComp); // $ExpectError +}