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

封装TypeScript泛型函数的onSuccess参数类型提取工具类型

提取函数第二个参数中onSuccess的首个参数类型,封装通用工具类型

我需要从一个函数的第二个对象类型参数里,提取可选onSuccess函数的第一个动态参数类型。目前使用Parameters<NonNullable<Parameters<typeof sampleFunction>[1]["onSuccess"]>>[0]可以实现需求,但这段代码可读性极差,希望封装成ResponseOf<typeof sampleFunction>这类通用工具类型。

相关代码如下:

interface ApiCallback<T = any> {
  onSuccess?: (response: T, headers?: any) => void;
  onFailure?: (error: unknown) => void;
  label: string;
  // ...other
}

interface ApiActionPayload<T = any> extends ApiCallback<T> {
  url: string;
  // ... other
}

interface ApiAction<T = any> {
  type: "API";
  payload: ApiActionPayload<T>;
}

function apiAction<T = any>({
  url = "",
  label = "",
  ...props
}: ApiActionPayload<T>): ApiAction<T> {
  return {
    type: "API",
    payload: {
      url,
      label,
      ...props
    }
  }
}

const sampleFunction = (_param1: any, callbacks: ApiCallback<{ data: any[] }>): ApiAction => {
  return apiAction({
    url: "google.com",
    ...callbacks
  })
}

type DesiredNonDynamicType = Parameters<NonNullable<Parameters<typeof sampleFunction>[1]["onSuccess"]>>[0];

export type ResponseOf<
  T extends (
    first: any,
    second: { onSuccess?: (x: any) => any; label: string;[k: string]: any },
    ...args: any[]
  ) => any> = T extends (first: any, second: { onSuccess?: (x: infer U) => any;[k: string]: any }, ...args: any[]) => any
  ? U : never;

type DesiredType = ResponseOf<typeof sampleFunction>;

我尝试过的实现如下:

export type ResponseOf<
  T extends (
    first: any,
    second: { onSuccess?: (x: any) => any; label: string; [k: string]: any },
    ...args: any[]
  ) => any
> = T extends (first: any, second: { onSuccess?: (x: infer U) => any; [k: string]: any }, ...args: any[]) => any
  ? U
  : never;

内容的提问来源于stack exchange,提问作者brayden67

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:45:30