如何让结合Omit的TypeScript泛型包装函数的智能提示更易读?
如何让结合Omit的TypeScript泛型包装函数的智能提示更易读?
我太懂这种头疼的感觉了——泛型逻辑明明跑起来没问题,VSCode的智能提示一出来却堆了一堆嵌套的工具类型,看着头大,完全没法快速判断该传啥参数。其实核心问题就是TS会把泛型里的Omit、Parameters这些工具类型全部展开显示,导致提示信息冗余又难懂。这里给你几个实用的优化方案:
方案一:用类型别名简化参数类型
把原来嵌套的Omit<Parameters<F>[0], "fs" | "http">抽成单独的类型别名,这样智能提示里会直接显示别名,而不是冗长的工具类型组合:
// 把参数类型抽成单独的别名 type WrappedParams<F extends (args: any) => any> = Omit<Parameters<F>[0], "fs" | "http">; const wrapped = <F extends (args: any) => any>( f: F, pre?: (params: WrappedParams<F>) => void ): ((args: WrappedParams<F>) => ReturnType<F>) => { return (args) => { if (pre) { pre(args); } return f({ fs, http, ...args }); }; };
这样当你调用包装后的函数时,智能提示会显示WrappedParams<原函数类型>,比直接展开Omit<...>清晰多了。
方案二:给返回的函数也加类型别名
如果想让返回值的提示更直观,可以把整个包装后的函数类型也抽成别名:
type WrappedFn<F extends (args: any) => any> = ( args: Omit<Parameters<F>[0], "fs" | "http"> ) => ReturnType<F>; const wrapped = <F extends (args: any) => any>( f: F, pre?: (params: Omit<Parameters<F>[0], "fs" | "http">) => void ): WrappedFn<F> => { return (args) => { if (pre) pre(args); return f({ fs, http, ...args }); }; };
现在智能提示里会直接显示WrappedFn<原函数类型>,用户一眼就能明白这是个接受处理后参数、返回原函数结果的函数。
方案三:用Prettify展开最终类型(最直观)
如果想让智能提示直接显示参数的具体结构,而不是泛型别名,可以用一个Prettify工具类型来消除类型嵌套:
// 这个工具类型能把复杂的嵌套类型展开成整洁的对象结构 type Prettify<T> = { [K in keyof T]: T[K] } & {}; type WrappedParams<F extends (args: any) => any> = Prettify< Omit<Parameters<F>[0], "fs" | "http"> >; const wrapped = <F extends (args: any) => any>( f: F, pre?: (params: WrappedParams<F>) => void ): ((args: WrappedParams<F>) => ReturnType<F>) => { return (args) => { if (pre) pre(args); return f({ fs, http, ...args }); }; };
比如你包装一个需要path和timeout参数的原函数,智能提示会直接显示{ path: string; timeout: number }这种清晰的结构,完全看不到Omit或者泛型的影子,对用户来说最友好。
本质上这些方案都是在减少智能提示里的噪音——把复杂的类型推导逻辑隐藏在别名或者工具类型后面,只给用户展示最需要的信息。你可以根据自己的需求选其中一种,我个人最推荐第三种,毕竟用户调用的时候最想看到的就是具体要传哪些参数~
备注:内容来源于stack exchange,提问作者Tom Manterfield
相关产品推荐
相关产品推荐

