如何为接受泛型的函数分配泛型函数类型?
问题描述
原TypeScript代码如下:
type TFormHookPerformValidation<formValuesT> = (params: { formValues: formValuesT, debugName?: string, }) => { isPassing: boolean, fieldErrors: Record<string, unknown>, formError: string, } const performValidation: TFormHookPerformValidation = params => { // Do something based on params and return return { isPassing: true, fieldErrors: {}, formError: '' } }
TFormHookPerformValidation是一个接收泛型参数的函数类型,但直接将它赋值给performValidation时,泛型参数会被隐式处理(通常变为unknown),导致函数失去泛型能力。需要让performValidation本身支持泛型,并将泛型参数传递给TFormHookPerformValidation。
注:可以使用Parameters和ReturnType工具类型,但希望能直接复用TFormHookPerformValidation类型本身。
解决方案
核心是把performValidation声明为泛型函数,并将它的泛型参数关联到TFormHookPerformValidation的泛型参数上。以下是最优实现方式:
type TFormHookPerformValidation<formValuesT> = (params: { formValues: formValuesT, debugName?: string, }) => { isPassing: boolean, fieldErrors: Record<string, unknown>, formError: string, } // 声明泛型函数,复用TFormHookPerformValidation的参数和返回值类型 const performValidation: <T>(params: Parameters<TFormHookPerformValidation<T>>[0]) => ReturnType<TFormHookPerformValidation<T>> = (params) => { // 这里params.formValues会被推断为泛型T的类型 return { isPassing: true, fieldErrors: {}, formError: '' } }
说明
- 通过
<T>将performValidation定义为泛型函数,T会传递给TFormHookPerformValidation作为其泛型参数 - 使用
Parameters<TFormHookPerformValidation<T>>[0]直接复用原类型的参数结构,避免重复编写{formValues: T, debugName?: string} - 使用
ReturnType<TFormHookPerformValidation<T>>复用原类型的返回值结构,同样避免重复定义返回类型
使用示例
调用时TypeScript会自动推断泛型类型:
// 传入字符串类型的formValues const strResult = performValidation({ formValues: "test input", debugName: "stringForm" }) // 传入对象类型的formValues const objResult = performValidation({ formValues: { username: "henok", age: 30 }, debugName: "userForm" })
在函数内部,params.formValues会被正确推断为对应的泛型类型,比如第二个示例中会是{username: string, age: number}。
内容的提问来源于stack exchange,提问作者Henok Tesfaye
相关产品推荐
相关产品推荐

