You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为接受泛型的函数分配泛型函数类型?

问题描述

原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: ''
  }
}

说明

  1. 通过<T>将performValidation定义为泛型函数,T会传递给TFormHookPerformValidation作为其泛型参数
  2. 使用Parameters<TFormHookPerformValidation<T>>[0]直接复用原类型的参数结构,避免重复编写{formValues: T, debugName?: string}
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:27:35