From 2bdf986666196e54f7b230476b5509c71288d47d Mon Sep 17 00:00:00 2001 From: Fedor Nezhivoi Date: Wed, 16 Nov 2016 11:13:37 +0200 Subject: [PATCH] fix type definitions for prop injection --- react-intl/index.d.ts | 22 +++++++++---------- react-intl/react-intl-tests.tsx | 38 +++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/react-intl/index.d.ts b/react-intl/index.d.ts index 76df84469e..1d6412defa 100644 --- a/react-intl/index.d.ts +++ b/react-intl/index.d.ts @@ -1,6 +1,6 @@ -// Type definitions for react-intl 2.0.0 +// Type definitions for react-intl 2.1.5 // Project: http://formatjs.io/react/ -// Definitions by: Bruno Grieder , Christian Droulers +// Definitions by: Bruno Grieder , Christian Droulers , Fedor Nezhivoi // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /// @@ -12,7 +12,7 @@ declare namespace ReactIntl { pluralRuleFunction?: (n: number, ord: boolean) => string; } - function injectIntl(clazz: T): T; + function injectIntl(component: React.ComponentClass | React.StatelessComponent): React.ComponentClass; function addLocaleData(data: Locale[] | Locale): void; @@ -34,14 +34,14 @@ declare namespace ReactIntl { formats?: any; } - interface InjectedIntlProps { - formatDate?: (date: Date, options?: FormattedDate.PropsBase) => string; - formatTime?: (date: Date, options?: FormattedTime.PropsBase) => string; - formatRelative?: (value: number, options?: FormattedRelative.PropsBase) => string; - formatNumber?: (value: number, options?: FormattedNumber.PropsBase) => string; - formatPlural?: (value: number, options?: FormattedPlural.PropsBase) => string; - formatMessage?: (messageDescriptor: FormattedMessage.MessageDescriptor, values?: Object) => string; - formatHTMLMessage?: (messageDescriptor: FormattedMessage.MessageDescriptor, values?: Object) => string; + interface InjectedIntl { + formatDate: (date: Date, options?: FormattedDate.PropsBase) => string; + formatTime: (date: Date, options?: FormattedTime.PropsBase) => string; + formatRelative: (value: number, options?: FormattedRelative.PropsBase) => string; + formatNumber: (value: number, options?: FormattedNumber.PropsBase) => string; + formatPlural: (value: number, options?: FormattedPlural.PropsBase) => string; + formatMessage: (messageDescriptor: FormattedMessage.MessageDescriptor, values?: Object) => string; + formatHTMLMessage: (messageDescriptor: FormattedMessage.MessageDescriptor, values?: Object) => string; } namespace IntlComponent { diff --git a/react-intl/react-intl-tests.tsx b/react-intl/react-intl-tests.tsx index f140dd95d1..cd484c17b4 100644 --- a/react-intl/react-intl-tests.tsx +++ b/react-intl/react-intl-tests.tsx @@ -1,5 +1,6 @@ /** * Created by Bruno Grieder and Christian Droulers + * Updated by Fedor Nezhivoi */ /// @@ -9,7 +10,7 @@ import * as reactMixin from "react-mixin" import { IntlProvider, -InjectedIntlProps, +InjectedIntl, addLocaleData, hasLocaleData, injectIntl, @@ -29,22 +30,23 @@ import reactIntlEn = require("react-intl/locale-data/en"); addLocaleData(reactIntlEn); console.log(hasLocaleData("en")); -interface SomeComponentProps extends InjectedIntlProps { - +interface SomeComponentProps { + intl: InjectedIntl } -class SomeComponent extends React.Component { +class SomeComponent extends React.Component { static propTypes: React.ValidationMap = { intl: intlShape.isRequired }; public render(): React.ReactElement<{}> { - const formattedDate = this.props.formatDate(new Date(), { format: "short" }); - const formattedTime = this.props.formatTime(new Date(), { format: "short" }); - const formattedRelative = this.props.formatRelative(new Date().getTime(), { format: "short" }); - const formattedNumber = this.props.formatNumber(123, { format: "short" }); - const formattedPlural = this.props.formatPlural(1, { one: "hai!" }); - const formattedMessage = this.props.formatMessage({ id: "hello", defaultMessage: "Hello {name}!" }, { name: "Roger" }); - const formattedHTMLMessage = this.props.formatHTMLMessage({ id: "hello", defaultMessage: "Hello {name}!" }, { name: "Roger" }); + const intl = this.props.intl; + const formattedDate = intl.formatDate(new Date(), { format: "short" }); + const formattedTime = intl.formatTime(new Date(), { format: "short" }); + const formattedRelative = intl.formatRelative(new Date().getTime(), { format: "short" }); + const formattedNumber = intl.formatNumber(123, { format: "short" }); + const formattedPlural = intl.formatPlural(1, { one: "hai!" }); + const formattedMessage = intl.formatMessage({ id: "hello", defaultMessage: "Hello {name}!" }, { name: "Roger" }); + const formattedHTMLMessage = intl.formatHTMLMessage({ id: "hello", defaultMessage: "Hello {name}!" }, { name: "Roger" }); return
{ } } +const SomeComponentWithIntl = injectIntl(SomeComponent); + class TestApp extends React.Component<{}, {}> { public render(): React.ReactElement<{}> { const definedMessages = defineMessages({ @@ -153,14 +157,16 @@ class TestApp extends React.Component<{}, {}> { const messages = { "hello": "Hello, {name}!" - } - return ( - - ) + }; + return ( + + + + ); } } export default { TestApp, - SomeComponent: injectIntl(SomeComponent) + SomeComponent: SomeComponentWithIntl }