如何获取TypeScript认定的变量编译时类型?
能否通过表达式获取TypeScript静态类型?
有没有办法用表达式获取TypeScript认定的某个值的静态类型?我搜了很多内容,但找到的都是JavaScript运行时类型相关的答案,不是TypeScript的静态类型。
举个例子:
const a = 5 as unknown as string; console.log(typeof a); // 输出:number
这段代码输出number,因为typeof获取的是JS运行时的类型。但TypeScript在静态检查时认定a是string类型,比如下面的代码能通过类型检查,就是因为TS认为a是string:
function naiveType(v: string): string { return "string"; } const a = 5 as unknown as string; console.log(naiveType(a));
结论:无法通过运行时表达式获取TS静态类型
TypeScript的静态类型是编译阶段的概念,编译后会被完全擦除,不会保留到JavaScript运行时环境中。所以不存在能在运行时获取TS认定的静态类型的表达式。
替代方案
编译阶段类型操作
如果需要在编译阶段确认或使用类型信息,可以用TS的内置类型工具:
- 用
typeof类型操作符在类型层面获取变量的类型:const a = 5 as unknown as string; type AType = typeof a; // AType 的类型为 string - 用
ReturnType、Parameters等工具类型提取函数的类型信息:function naiveType(v: string): string { return "string"; } type NaiveTypeReturn = ReturnType<typeof naiveType>; // 类型为 string
这些操作仅在编译阶段生效,不会生成任何运行时代码。
运行时与静态类型同步
如果需要在运行时实现和静态类型匹配的判断逻辑,只能手动维护一致性,比如使用类型守卫:
function isString(v: unknown): v is string { return typeof v === "string"; } const a = 5 as unknown as string; if (isString(a)) { // 此处TS静态检查认定a是string,同时运行时也完成了类型校验 console.log("a符合string类型"); }
内容的提问来源于stack exchange,提问作者Mrk Sef
相关产品推荐
相关产品推荐

