From 5d0ec77b89a780f4edeed1f45c2cc129aa76267d Mon Sep 17 00:00:00 2001 From: Chandler Prall Date: Wed, 9 Jan 2019 12:54:16 -0700 Subject: [PATCH 1/3] Add PropsOf type, change EuiIconTipProps to use it --- src/components/common.ts | 8 ++++++++ src/components/tool_tip/index.d.ts | 16 ++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/components/common.ts b/src/components/common.ts index 8789e5c5aeb..2cb42f0d33d 100644 --- a/src/components/common.ts +++ b/src/components/common.ts @@ -1,3 +1,5 @@ +import { Component, FunctionComponent, SFC } from 'react'; + export interface CommonProps { className?: string; 'aria-label'?: string; @@ -18,6 +20,12 @@ export function keysOf(obj: T): K[] { return Object.keys(obj) as K[]; } +export type PropsOf = + C extends SFC ? SFCProps : + C extends FunctionComponent ? FunctionalProps : + C extends Component ? ComponentProps + : never; + /* TypeScript's discriminated unions are overly permissive: as long as one type of the union is satisfied the other types are not validated against. For example: diff --git a/src/components/tool_tip/index.d.ts b/src/components/tool_tip/index.d.ts index d4b76c0a272..d4a269d922e 100644 --- a/src/components/tool_tip/index.d.ts +++ b/src/components/tool_tip/index.d.ts @@ -1,4 +1,6 @@ import { ReactElement, ReactNode, SFC } from 'react'; +import { EuiIcon } from '../icon'; +import { PropsOf } from '../common'; declare module '@elastic/eui' { export type ToolTipPositions = @@ -11,7 +13,8 @@ declare module '@elastic/eui' { | 'regular' | 'long'; - export interface ToolTipProps { + export interface EuiToolTipProps { + children: ReactElement; className?: string; content: ReactNode; delay?: ToolTipDelay; @@ -19,18 +22,15 @@ declare module '@elastic/eui' { id?: string; position?: ToolTipPositions; } - - export interface EuiToolTipProps { - children: ReactElement; - } - export const EuiToolTip: SFC; + export const EuiToolTip: SFC; export interface EuiIconTipProps { color?: string; type?: string; size?: string; 'aria-label'?: string; - iconProps?: object; + content: ReactNode; + iconProps?: PropsOf; } - export const EuiIconTip: SFC; + export const EuiIconTip: SFC; } From 68919b587b7f6f2108673c3b007b3c7c5d488717 Mon Sep 17 00:00:00 2001 From: Chandler Prall Date: Wed, 9 Jan 2019 14:43:05 -0700 Subject: [PATCH 2/3] Refactor EuiToolTip and EuiIconTip type defs --- src/components/tool_tip/index.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/tool_tip/index.d.ts b/src/components/tool_tip/index.d.ts index d4a269d922e..8e01a396213 100644 --- a/src/components/tool_tip/index.d.ts +++ b/src/components/tool_tip/index.d.ts @@ -1,6 +1,7 @@ import { ReactElement, ReactNode, SFC } from 'react'; +import { EuiIconTipProps, ToolTipDelay, ToolTipPositions } from '@elastic/eui'; import { EuiIcon } from '../icon'; -import { PropsOf } from '../common'; +import { Omit, PropsOf } from '../common'; declare module '@elastic/eui' { export type ToolTipPositions = @@ -16,7 +17,7 @@ declare module '@elastic/eui' { export interface EuiToolTipProps { children: ReactElement; className?: string; - content: ReactNode; + content?: ReactNode; delay?: ToolTipDelay; title?: ReactNode; id?: string; @@ -29,8 +30,7 @@ declare module '@elastic/eui' { type?: string; size?: string; 'aria-label'?: string; - content: ReactNode; iconProps?: PropsOf; } - export const EuiIconTip: SFC; + export const EuiIconTip: SFC & EuiIconTipProps>; } From 2e874827447b9017e511fc6886d7164b7c88af63 Mon Sep 17 00:00:00 2001 From: Chandler Prall Date: Wed, 9 Jan 2019 15:06:23 -0700 Subject: [PATCH 3/3] Clean up imports --- src/components/tool_tip/index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/tool_tip/index.d.ts b/src/components/tool_tip/index.d.ts index 8e01a396213..bd02a8b9e7a 100644 --- a/src/components/tool_tip/index.d.ts +++ b/src/components/tool_tip/index.d.ts @@ -1,5 +1,4 @@ import { ReactElement, ReactNode, SFC } from 'react'; -import { EuiIconTipProps, ToolTipDelay, ToolTipPositions } from '@elastic/eui'; import { EuiIcon } from '../icon'; import { Omit, PropsOf } from '../common';