ReturnType 用于提取函数类型的返回值类型,需传入函数类型(如 typeof fn),而非调用结果;支持普通函数、箭头函数、泛型函数等,重载函数取最后一个签名,构造函数不适用。

ReturnType 是 TypeScript 内置的工具类型,用于**提取函数类型的返回值类型**。它不作用于函数调用,而是作用于函数类型本身(比如函数声明、函数表达式、箭头函数的类型,或类型别名定义的函数类型)。
基本用法:从函数类型中提取返回类型
你不能直接对函数调用写 ReturnType<typeof somefunc></typeof> —— 这是常见误区。正确做法是传入函数的类型(通常用 typeof 函数名 获取):
-
✅ 正确:
ReturnType<typeof myfunction></typeof> -
❌ 错误:
ReturnType<typeof myfunction></typeof>(这是取调用结果的类型,不是 ReturnType 的用途)
支持多种函数类型
ReturnType 可以处理:
- 普通函数声明:
function foo() { return 42; }→ReturnType<typeof foo> === number</typeof> - 箭头函数表达式:
const bar = () => "hello";→ReturnType<typeof bar> === string</typeof> - 带泛型的函数:
function identity<t>(x: T): T { return x; }</t>→ReturnType<typeof identity> === unknown</typeof>(因为未指定具体类型参数,推导为unknown;若写ReturnType<typeof identity>></typeof>则为string) - 方法(类中函数):
class C { method() { return true; } }→ReturnType<typeof c.prototype.method> === boolean</typeof>
实用场景举例
常用于类型安全的封装或响应式逻辑:
- 定义一个与原函数返回类型一致的 state 类型:
const fetchData = () => Promise.resolve({ id: 1 });type Data = ReturnType<typeof fetchdata>; // Promise</typeof> - 配合
await提取实际数据类型(需嵌套Awaited):type ResolvedData = Awaited<returntype fetchdata>>; // { id: number }</returntype> - 高阶函数中保持类型传递:
function withLog<f extends any> any>(fn: F): F { ... }</f>
可结合ReturnType<f></f>精确标注返回类型
注意边界情况
某些函数类型可能让 ReturnType 推导出 any 或 unknown:
- 函数没有明确返回类型且无法被 TS 完全推导时(如含复杂条件分支),可能退化为
any - 重载函数只取最后一个重载签名的返回类型(TypeScript 对重载的支持有限)
- 构造函数(
new表达式)不适用 —— 应该用InstanceType


















