我试图从函数的第二个参数中钻取一个参数,该参数是一个对象;从我想要获取"onSuccess"函数(它是可选的,但当我请求它时它将是必需的)的对象=>获得动态函数的第一个参数.

Parameters<NonNullable<Parameters<typeof sampleFunction>[1]["onSuccess"]>>[0]可以工作,但我不想到处使用,因为它的可读性不是很好.我想做一些动感的东西,比如:ResponseOf<typeof sampleFunction>

TS playground link

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>;

我try 过的一件事,例如:

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;

推荐答案

实现这一点的最简单方法是在conditional type inference中重新使用ApiCallback实用程序类型.写ApiCallback<infer U>将比试图对任何东西进行反向工程要简单得多.例如:

export type ResponseOf<T> =
  T extends (first: any, second: ApiCallback<infer U>, ...args: any) => any ? U : never

这给了你想要的行为:

type DesiredType = ResponseOf<typeof sampleFunction>;
/* type DesiredType = {
    data: any[];
} */

Playground link to code

Typescript相关问答推荐

TS不推断类型在条件判断后具有属性'

为什么TypeScript失go 了类型推断,默认为any?''

返回同时具有固定键和变量键的对象的函数的返回类型

输入元素是类型变体的对象数组的正确方法是什么?'

react 路由6操作未订阅从react 挂钩表单提交+也不使用RTK查询Mutations

如何使函数接受类型脚本中具有正确类型的链接修饰符数组

迁移到Reaction路由V6时,获取模块Reaction-Router-Dom';没有导出的成员RouteComponentProps错误

在Reaction-Native-ReAnimated中不存在Animated.Value

以Angular 自定义快捷菜单

MatTool提示在角垫工作台中不起作用

使用数组作为类型中允许的键的列表

TypeScrip:强制使用动态密钥

常量类型参数回退类型

在React中定义props 的不同方式.FunctionalComponent

如何在使用条件类型时使用void

TypeScrip:从嵌套的对象值创建新类型

为什么受歧视的unions 在一种情况下运作良好,但在另一种非常类似的情况下却不起作用?

如何调整项目数组,但允许权重影响顺序

有没有一种方法可以防止我的组件包在其中安装样式组件'; node 模块中的s目录

如何为字符串模板文字创建类型保护