如何让VS Code跳转至柯里化函数定义而非柯里化工具函数?
解决VS Code跳转定义到包装函数而非原业务函数的问题
有几种可行的方式可以解决这个问题,从代码层面配置到编辑器设置都有对应的方案:
方案一:拆分原函数与包装函数,配合TSDoc注解
把业务逻辑单独写成命名函数,再用工具函数包装导出,同时在包装后的变量上添加@see注解指向原业务函数:
/** * 获取用户活动列表 * @see getActivitiesImpl */ export const getActivities = refreshTokenAsNeeded(getActivitiesImpl); /** * 实际处理活动列表获取的业务逻辑 */ async function getActivitiesImpl() { const response = await fetch('/api/activities'); return response.json(); }
这样Cmd+Click调用getActivities时,虽然默认会跳转到包装后的变量定义,但可以通过TSDoc里的@see链接直接跳转到原业务函数。如果开启VS Code的相关设置,还能直接优先跳转原函数。
方案二:让工具函数严格保留原函数类型
通过泛型精确捕获原函数的参数和返回值类型,让工具函数返回与原函数完全一致的类型,帮助TypeScript和VS Code识别原函数的定义:
// 柯里化工具函数的类型定义 function refreshTokenAsNeeded<T extends (...args: any[]) => Promise<any>>( fn: T ): T { return async (...args: Parameters<T>): Promise<ReturnType<T>> => { // 令牌过期检查与刷新逻辑 if (isTokenExpired()) { await refreshAccessToken(); } return fn(...args); } as T; } // 原业务函数 async function getActivitiesImpl() { // 业务逻辑实现 } // 包装后导出 export const getActivities = refreshTokenAsNeeded(getActivitiesImpl);
这种写法下,TypeScript会将getActivities的类型与getActivitiesImpl完全对齐,VS Code的定义跳转逻辑会更倾向于关联到原业务函数。
方案三:调整VS Code编辑器设置
打开VS Code设置,搜索typescript.preferences.preferGoToSourceDefinition并设置为true。这个选项会让编辑器在遇到类型匹配的多个定义时,优先跳转到原始的源函数实现,而非包装后的函数引用。
内容的提问来源于stack exchange,提问作者Eats Indigo
相关产品推荐
相关产品推荐

