如何让TypeScript的errorBound函数正确推导泛型函数的返回类型
解决方案
你的代码问题在于泛型约束过于宽泛,Function类型无法让TypeScript正确推导函数返回值类型。以下是修正方案:
方案一:在函数上直接定义泛型
export const errorBound = async <Fn extends () => unknown>(fn: Fn): Promise<ReturnType<Fn> | Error> => { try { return await fn(); } catch (e) { console.error("errorBound!!"); console.error({ e }); return e as Error; } };
调用const foo = errorBound(() => 1)时,foo的类型会自动推导为Promise<number | Error>。这里将泛型Fn约束为无参数函数,确保ReturnType<Fn>能准确获取返回类型;同时对catch中的e添加as Error断言,因为catch捕获的错误默认类型是unknown,需要明确类型以匹配返回值要求。
方案二:修正类型别名的泛型定义
若需保留ErrorBound类型别名,需明确泛型的函数约束:
type ErrorBound = <Fn extends () => unknown>(fn: Fn) => Promise<ReturnType<Fn> | Error>; export const errorBound: ErrorBound = async (fn) => { try { return await fn(); } catch (e) { console.error("errorBound!!"); console.error({ e }); return e as Error; } };
核心要点
- 替换
Fn extends Function为Fn extends () => unknown,缩小泛型范围,让TypeScript能正确解析函数返回类型。 - catch块中必须对错误对象做类型断言,否则会因
unknown类型与返回值的Error不兼容而报错。
内容的提问来源于stack exchange,提问作者MINJA KIM
相关产品推荐
相关产品推荐

