typeof 在 typescript 中不转换运行时对象,而是静态提取已存在值的推导类型;需用 const 声明确保类型精确,支持嵌套结构和工具类型加工,本质是类型反射。

在 TypeScript 中,typeof 操作符本身不会“转换” JavaScript 对象——它不改变运行时值,也不执行类型转换。它的作用是在类型上下文中,基于一个已存在的值(如对象字面量、变量、属性),静态地提取其推导出的类型,从而让这个类型可复用、可约束、可组合。
核心逻辑:值存在 → 类型自动推导 → typeof 提取该类型
只要 JS 对象在编译时是确定的(即不是 any/unknown 或动态构造的),TS 就能根据其结构做类型推断;typeof 就是把这份推断结果“抓出来”,变成一个命名类型。
- 对象必须是具名变量或 const 声明(推荐
const),确保类型不被宽泛化 - 不能对函数调用、表达式或未声明的字面量直接用
typeof(如typeof {x:1}会报错) - 类型提取发生在编译期,零运行时开销
典型写法:用 const 定义对象,再用 typeof 获取类型
这是最稳妥、最常用的方式:
const user = {
name: "Alice",
age: 30,
isActive: true
} as const; // 可选:加 as const 可保留字面量类型(如 "Alice" 而非 string)
<p>type UserType = typeof user;
// 等价于:
// type UserType = {
// readonly name: "Alice";
// readonly age: 30;
// readonly isActive: true;
// }
</p>
若去掉 as const,typeof user 仍有效,但推导为更宽泛的类型:{ name: string; age: number; isActive: boolean }。
支持嵌套对象和数组结构
typeof 能完整捕获层级结构,包括方法、可选属性、联合类型等:
const config = {
apiUrl: "https://api.example.com",
timeout: 5000,
features: ["auth", "analytics"] as const,
onReady?: () => void
};
<p>type ConfigType = typeof config;
// 自动包含:
// - apiUrl: string
// - timeout: number
// - features: readonly ["auth", "analytics"]
// - onReady?: () => void
</p>
配合工具类型进一步加工
提取出的类型可直接用于 Partial、Pick、Readonly 等内置工具类型,实现灵活复用:
type PartialUser = Partial<typeof user>;</typeof>type UserKeyOnly = keyof typeof user; // "name" | "age" | "isActive"type NameType = (typeof user)["name"]; // string 或 "Alice"(取决于是否 as const)
本质上,这不是“转换”,而是“类型反射”——把 JS 值的形状,原样映射成 TS 类型系统里的定义。写法简单,但依赖清晰的值定义和合理的 const 使用习惯。










