如何输入回调参数,该参数将被柯里化函数接收



我尝试创建props getter fabric。它是一个柯里化函数。外部函数接收defaultParamspropsConstructor回调。propsConstructor是基于defaultParams和调用内部函数后将接收的新道具计算新道具对象的逻辑。

Propblem:props,它将在调用嵌套函数时被错误地接收。现在我可以管理的情况下,当我需要键入一些回调,它的一些参数将在调用一个嵌套函数后收到

// basic types
type EmptyObject = Record<string, never>
type AnyObject = Record<string, unknown>
type ObjectType = EmptyObject | AnyObject
export type PropsConstructor<
DefParams extends AnyObject,
Props extends AnyObject, // will be received later after invoking nested function
ReturnObject extends AnyObject
> = (defaultParams: DefParams, props: Props) => ReturnObject
/**
* @description input field props getter fabric
* @returns props object that will be passed to inpuit
*/
export const createPropsGetter = <
DefParams extends AnyObject,
ReturnObject extends AnyObject,
Constr extends PropsConstructor<DefParams, AnyObject, ReturnObject>
>({
defaultParams,
propsConstructor,
}: {
defaultParams: DefParams
propsConstructor: Constr
}) => {
return <NewProps extends AnyObject>(props: NewProps) => {
return propsConstructor(defaultParams, props)
}
}
const defaultParams = { one: 1, two: 2 }
type Props = { four: number }
type ReturnObject = typeof defaultParams & Props
const propsConstructor: PropsConstructor<
typeof defaultParams,
{ four: 4 },
ReturnObject
> = (defParams, props) => ({ ...defParams, ...props })
// const getter: <{ four: number }>(props: { four: number }) => AnyObject
const getter = createPropsGetter({
defaultParams,
propsConstructor,
})
const props = getter({ four: 4 }) 
props // AnyObject

目标:定义回调参数的类型。参数将在调用嵌套函数

之后接收。:从嵌套函数接收的props和结果对象的类型为AnyObject

经过一些尝试,找到一个解决方案:

export const createPropsGetter = <
DefParams extends AnyObject,
// set second param to any to suppress ts warning
Constr extends (def: DefParams, properties: any) => AnyObject
>({
defaultParams,
propsConstructor,
}: {
defaultParams: DefParams
propsConstructor: Constr
}) => {
return <NewProps extends AnyObject>(props: NewProps) => {
// infer type of passed callback
const constr: typeof propsConstructor = propsConstructor
// hardcode return type with 'as'
return constr(defaultParams, props) as ReturnType<typeof constr>
}
}

工作,如果回调将键入PropsConstructorutil类型

const defaultParams = { one: 1, two: 2 }
const newParams = { four: 4 }
type ReturnedProps = typeof defaultParams & typeof newParams
const propsConstructor: PropsConstructor<
typeof defaultParams,
typeof newParams,
ReturnedProps
> = (defParams, props) => ({ ...defParams, ...props })
const getter = createPropsGetter({
defaultParams,
propsConstructor,
})
const props = getElementProps({ four: 4 }) // typed as ReturnedProps: { one: 1, two: 2, four: 4 }

最新更新