为何TypeScript中无法通过typeof直接获取函数调用的返回类型?
为什么
typeof fn("ABC")无法生效,以及更简洁的替代写法 核心原因
TypeScript的类型系统与运行时逻辑完全分离。typeof在类型上下文中的作用是获取某个值的类型,而非执行一段运行时代码后取结果的类型。函数调用fn("ABC")属于运行时的执行操作,类型系统不会模拟函数的执行过程推导返回值类型,只能通过函数的类型定义做静态推导,因此直接写typeof fn("ABC")会报错。
不创建冗余变量的替代方案
方案1:自定义工具类型实现自动推断
通过条件类型和infer关键字,创建工具类型根据参数类型自动推导函数返回值:
declare const fn: <T>(arg: T) => T extends string ? number : boolean; // 工具类型:根据传入的参数类型T,推导fn的返回值类型 type CallFn<T> = typeof fn extends (arg: T) => infer R ? R : never; // 自动推断返回值为number type a4 = CallFn<"abc">; // 自动推断返回值为boolean type a5 = CallFn<123>;
方案2:结合ReturnType与匿名函数推断
无需自定义工具类型,直接通过构造匿名函数让TypeScript自动推断泛型参数:
// 自动推断fn的泛型T为"abc",返回值类型为number type a6 = ReturnType<(arg: "abc") => typeof fn(arg)>;
关于拒绝显式传递泛型的合理性
正如你所说,泛型的核心价值是辅助类型推断,让用户可以像使用普通函数一样调用泛型函数,无需手动指定类型。显式传递typeof fn<"abc">虽然能得到正确类型,但违背了泛型“隐式推断”的设计初衷,确实不够优雅。
内容的提问来源于stack exchange,提问作者Autumn
相关产品推荐
相关产品推荐

