可直接用 returntype 提取函数返回值类型,需传入函数类型而非调用结果,且函数须有明确或可推导的返回类型;重载函数默认取最后一个签名。

可以直接用 ReturnType<typeof></typeof> 提取函数的返回值类型,关键是要传入函数的类型(而非调用结果),且函数必须有明确的返回类型或可推导的返回类型。
正确写法:用 typeof 获取函数类型
ReturnType 接收的是一个函数类型,不是函数调用结果。所以必须用 typeof 拿到函数的类型签名:
-
ReturnType<typeof myfn></typeof>✅ 正确 ——typeof myFn得到的是类似() => string的类型 -
ReturnType<myfn></myfn>❌ 错误 ——myFn()是值,不是类型 -
ReturnType<myfn></myfn>❌ 错误 ——myFn是值,TS 会报 “不能用值做类型”
函数需有可推导的返回类型
如果函数没有显式标注返回类型,且内部逻辑复杂(比如多分支、异步、无返回值),TS 可能推导出 any 或 unknown,甚至报错。确保函数类型清晰:
- 显式标注返回类型最稳妥:
const fn = (): number => 42; - 简单同步函数通常能自动推导:
const say = () => "hello";→ReturnType<typeof say></typeof>是string - 箭头函数带参数也 OK:
const add = (a: number, b: number) => a + b;→ 返回类型是number
常见使用场景示例
常用于定义响应类型、包装函数或类型守卫:
- 提取 API 调用返回类型:
type User = ReturnType<typeof fetchuser>;</typeof> - 配合泛型工具:
function wrap<t extends any> any>(fn: T): T { return fn; }</t>,再用ReturnType<t></t>约束返回 - 避免重复写类型:
const data = getData();,直接用type Data = ReturnType<typeof getdata>;</typeof>定义 data 类型
注意点:重载函数和声明合并
对含重载声明的函数(如在 namespace 或 interface 中多次声明),ReturnType<typeof fn></typeof> 默认取最后一个重载签名的返回类型。如需精确控制,建议单独提取某个签名:
- 用类型断言或辅助类型隔离特定签名:
type FirstOverload = { (x: string): number } & { (x: number): string }; - 或者改用内联函数类型:
type MyFn = (s: string) => boolean;,再ReturnType<myfn></myfn>











