封装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
相关产品推荐
相关产品推荐

