forked from ddrilling/asb_cloud_front
Улучшена работа FunctionalValue
This commit is contained in:
parent
1b6768be90
commit
c9a17b8de9
@ -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
|
||||
/** Событие, вызываемое при нажатий кнопки "Обновить" */
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user