You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中能否直接对函数调用结果使用typeof获取类型?

直接对函数调用结果使用typeof定义类型别名的方案与原因

可行方案

分两种情况处理,取决于你的TypeScript版本:

  1. TypeScript 4.7及以上版本
    直接写typeof identity("s")完全合法,编译器会在类型层面解析函数调用并推导返回类型:

    const identity = <T extends unknown>(x: T) => x;
    type S = typeof identity("s"); // 类型为字面量类型 "s"
    type N = typeof identity(5); // 类型为字面量类型 5
    
  2. TypeScript 4.7以下版本
    旧版本不支持类型层面的直接函数调用,可通过ReturnType工具类型配合显式泛型参数实现:

    const identity = <T extends unknown>(x: T) => x;
    // 方式1:直接结合ReturnType与显式泛型
    type S = ReturnType<typeof identity<"s">>;
    // 方式2:先定义绑定泛型的函数类型,再取返回值
    type IdentityForStr = typeof identity<"s">;
    type S2 = ReturnType<IdentityForStr>;
    // 当然也可以用你目前的变量中转方案
    const s = identity("s");
    type S3 = typeof s;
    

报错原因

在TypeScript 4.7之前,类型系统的typeof操作符仅能作用于值标识符(比如变量名、对象属性名),无法直接解析运行时的函数调用表达式。这是因为早期TS的类型系统与运行时上下文严格分离,编译器不会在类型层面执行函数调用的推导逻辑。

而4.7版本引入了类型层面函数调用表达式的支持,允许编译器在类型上下文里,基于函数的泛型定义和传入的类型参数,直接推导调用后的返回类型,从而支持typeof identity("s")这种写法。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:23:09