Улучшена работа FunctionalValue

This commit is contained in:
Александр Сироткин 2022-07-31 01:02:46 +05:00
parent 1b6768be90
commit c9a17b8de9
4 changed files with 10 additions and 5 deletions

View File

@ -8,7 +8,7 @@ import { BasePluginSettings } from './base'
export type D3ContextMenuSettings = {
/** Метод или объект отрисовки пунктов выпадающего меню */
overlay?: FunctionalValue<ReactElement | null, [SVGSVGElement | null]>
overlay?: FunctionalValue<(svg: SVGSVGElement | null) => ReactElement | null>
/** Название графика для загрузки */
downloadFilename?: string
/** Событие, вызываемое при нажатий кнопки "Обновить" */

View File

@ -55,7 +55,7 @@ const parseApiEror = (err: unknown, actionName?: string) => {
export const invokeWebApiWrapperAsync = async (
funcAsync: asyncFunction,
setShowLoader?: Dispatch<SetStateAction<boolean>>,
errorNotifyText?: FunctionalValue<ReactNode, [unknown]>,
errorNotifyText?: FunctionalValue<(err: unknown) => ReactNode>,
actionName?: string,
) => {
setShowLoader?.(true)

View File

@ -1,11 +1,14 @@
import { useMemo } from 'react'
import { ArgumentTypes } from '@utils/types'
/**
* Значение типа может быть представлено непосредственно значением либо функцией его возвращаюшей
*/
export type FunctionalValue<T, P extends Array<any> = []> = T | ((...props: P) => T)
export type ReturnType<T> = T extends (...args: any) => infer R ? R : any
export type FunctionalValue<F extends Function> = ReturnType<F> | F
export const getFunctionalValue = <T, P extends Array<any>>(value: FunctionalValue<T, P>) => value instanceof Function ? value : () => value
export const getFunctionalValue = <F extends Function>(value: FunctionalValue<F>) => value instanceof Function ? value : ((...args: ArgumentTypes<F>) => value) as unknown as F
/**
* Облегчает работу со значениями, которые могут быть представлены функциям.
@ -13,7 +16,7 @@ export const getFunctionalValue = <T, P extends Array<any>>(value: FunctionalVal
* @param value Значение или функция его возвращающая
* @returns Функция, вызов которой вернёт искомое значение
*/
export const useFunctionalValue = <T, P extends Array<any>>(value: FunctionalValue<T, P>) => {
export const useFunctionalValue = <F extends Function>(value: FunctionalValue<F>) => {
const fun = useMemo(() => getFunctionalValue(value), [value])
return fun
}

View File

@ -7,3 +7,5 @@
* @returns Общий тип с полным `T` и несовпадающими полями из `R`
*/
export type OmitExtends<T, R> = T & Omit<R, keyof T>
export type ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never