From c9a17b8de98aacc4140a333dac802090d7891384 Mon Sep 17 00:00:00 2001 From: goodmice Date: Sun, 31 Jul 2022 01:02:46 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20FunctionalValue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/d3/plugins/D3ContextMenu.tsx | 2 +- src/components/factory.ts | 2 +- src/utils/hooks/functionalValue.ts | 9 ++++++--- src/utils/types/index.ts | 2 ++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/d3/plugins/D3ContextMenu.tsx b/src/components/d3/plugins/D3ContextMenu.tsx index 673222e..9c78d0d 100644 --- a/src/components/d3/plugins/D3ContextMenu.tsx +++ b/src/components/d3/plugins/D3ContextMenu.tsx @@ -8,7 +8,7 @@ import { BasePluginSettings } from './base' export type D3ContextMenuSettings = { /** Метод или объект отрисовки пунктов выпадающего меню */ - overlay?: FunctionalValue + overlay?: FunctionalValue<(svg: SVGSVGElement | null) => ReactElement | null> /** Название графика для загрузки */ downloadFilename?: string /** Событие, вызываемое при нажатий кнопки "Обновить" */ diff --git a/src/components/factory.ts b/src/components/factory.ts index 43df914..3d721da 100755 --- a/src/components/factory.ts +++ b/src/components/factory.ts @@ -55,7 +55,7 @@ const parseApiEror = (err: unknown, actionName?: string) => { export const invokeWebApiWrapperAsync = async ( funcAsync: asyncFunction, setShowLoader?: Dispatch>, - errorNotifyText?: FunctionalValue, + errorNotifyText?: FunctionalValue<(err: unknown) => ReactNode>, actionName?: string, ) => { setShowLoader?.(true) diff --git a/src/utils/hooks/functionalValue.ts b/src/utils/hooks/functionalValue.ts index 8726e35..95fb552 100644 --- a/src/utils/hooks/functionalValue.ts +++ b/src/utils/hooks/functionalValue.ts @@ -1,11 +1,14 @@ import { useMemo } from 'react' +import { ArgumentTypes } from '@utils/types' + /** * Значение типа может быть представлено непосредственно значением либо функцией его возвращаюшей */ -export type FunctionalValue = []> = T | ((...props: P) => T) +export type ReturnType = T extends (...args: any) => infer R ? R : any +export type FunctionalValue = ReturnType | F -export const getFunctionalValue = >(value: FunctionalValue) => value instanceof Function ? value : () => value +export const getFunctionalValue = (value: FunctionalValue) => value instanceof Function ? value : ((...args: ArgumentTypes) => value) as unknown as F /** * Облегчает работу со значениями, которые могут быть представлены функциям. @@ -13,7 +16,7 @@ export const getFunctionalValue = >(value: FunctionalVal * @param value Значение или функция его возвращающая * @returns Функция, вызов которой вернёт искомое значение */ -export const useFunctionalValue = >(value: FunctionalValue) => { +export const useFunctionalValue = (value: FunctionalValue) => { const fun = useMemo(() => getFunctionalValue(value), [value]) return fun } diff --git a/src/utils/types/index.ts b/src/utils/types/index.ts index 93e31e5..c619b26 100644 --- a/src/utils/types/index.ts +++ b/src/utils/types/index.ts @@ -7,3 +7,5 @@ * @returns Общий тип с полным `T` и несовпадающими полями из `R` */ export type OmitExtends = T & Omit + +export type ArgumentTypes = F extends (...args: infer A) => any ? A : never