TypeScript中能否直接对函数调用结果使用typeof获取类型?
直接对函数调用结果使用typeof定义类型别名的方案与原因
可行方案
分两种情况处理,取决于你的TypeScript版本:
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); // 类型为字面量类型 5TypeScript 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
相关产品推荐
相关产品推荐

