news 2026/6/25 9:53:49

12. typeof 在 TypeScript 里有什么作用?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
12. typeof 在 TypeScript 里有什么作用?

目录

一、 第一层:双重身份(定性回答)

二、 第二层:三大核心应用场景(技术深度)

1. 从“值”推导“类型”(避免重复定义)

2. “王炸组合”:keyof typeof

3. 获取函数的签名

三、 第三层:进阶细节(避坑与加分)

四、 面试简答模板(建议背诵)

回答思路

简答模板

💡 精彩对比示例(如果需要演示)


回答typeof的面试题,精彩之处在于你能清晰地划分其在JavaScript(运行期)TypeScript(编译器)中完全不同的双重身份。

以下是为你准备的深度解析和面试答题模板:


一、 第一层:双重身份(定性回答)

typeof在 TypeScript 中具有**‘双重人格’** :

  1. 在值空间(Value Space):它是原生的 JavaScript 操作符,在运行时执行,返回一个表示变量类型的字符串(如"string","object"等)。
  2. 在类型空间(Type Space):它是 TypeScript 的类型查询操作符。它在编译时执行,用于获取一个变量或属性的‘静态类型’,并将其用于类型定义。”

二、 第二层:三大核心应用场景(技术深度)

1. 从“值”推导“类型”(避免重复定义)

这是最常用的场景。如果你已经定义了一个复杂的常量或对象,不需要再手写一个对应的interface

  • 示例const config = { port: 8080, host: 'localhost' };
  • 应用type Config = typeof config;—— 此时Config自动获得了确切的结构。
2. “王炸组合”:keyof typeof

在处理配置对象或常量映射时,这是最精彩的用法。

  • 场景:获取一个对象中所有键名作为联合类型。
  • 代码type ConfigKeys = keyof typeof config;// 得到"port" | "host"
  • 价值:当config对象增加属性时,ConfigKeys自动更新,彻底解决了类型同步的痛点。
3. 获取函数的签名

当你需要引用一个第三方库导出的具体函数类型,但对方没提供Type定义时。

  • 应用type FuncType = typeof myFunc;—— 可以直接用它来约束高阶函数或回调。

三、 第三层:进阶细节(避坑与加分)

  1. 类(Class)的特殊性
    • 对类名使用typeof,获取的是类的构造函数类型(Constructor),而不是类的实例类型。
    • 如果不加typeofconst a: Person指的是Person实例
  2. 局限性typeof只能查询变量、属性、函数的类型,不能查询函数调用的结果或复杂的表达式。

四、 面试简答模板(建议背诵)

面试官:TypeScript 中 typeof 有什么作用?

回答模板:

“在 TypeScript 中,typeof的作用可以总结为:‘以现有的值作为蓝本,自动提取类型信息’

它在运行期和编译期有不同的表现。在运行期,它就是普通的 JStypeof;但在开发阶段,它是我们的类型推导神器

我在实际项目中主要用它解决三个问题:

  1. 实现‘唯一事实来源’(Single Source of Truth):比如我先写好一份复杂的Const配置,再通过typeof提取类型。这样我修改配置值时,类型定义会自动跟随变化,不需要手动维护两套代码,减少了出错概率。
  2. 配合 keyof 使用:经常用keyof typeof obj来动态生成属性名联合类型。这是编写强类型工具函数(如getSetting(key))时的核心逻辑。
  3. 处理外部模块:当使用一些没写类型定义的旧 JS 库时,我会通过typeof捕获其导出的函数或对象结构,快速构建出临时类型约束。

简单一句话总结:typeof让我们能够‘基于代码推导类型’,大大降低了手动维护冗余类型的成本。

回答思路

  • 不是 JS 运行时typeof
  • 在类型层面获取变量类型

简答模板

在 TypeScript 里,typeof可以用来获取一个变量或对象的类型。
它通常用于从已有值推导出对应的类型,避免重复定义类型结构。


💡 精彩对比示例(如果需要演示)

const colors = { red: "#ff0000", blue: "#0000ff" }; // 1. 获取类型 type ColorTheme = typeof colors; /* 得到: { red: string; blue: string; } */ // 2. 获取键名联合类型(面试最爱问) type ColorNames = keyof typeof colors; /* 得到: "red" | "blue" */ // 3. 在运行期和编译期的区别 const str = "hello"; let isString = (typeof str === 'string'); // 运行期 JS 逻辑 type StrType = typeof str; // 编译期 TS 逻辑,得到 string 类型
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 14:51:14

dify关键词优化技巧

在 Dify 中,“关键词优化”通常涉及两个层面:一是优化用户输入的查询关键词,以提升知识库检索的准确性;二是优化知识库本身的内容关键词,以提高被检索到的概率。以下是针对不同场景的实用技巧。🔍 场景一&a…

作者头像 李华
网站建设 2026/6/24 7:16:15

Windows安卓应用安装器:告别模拟器,开启无缝跨平台体验

Windows安卓应用安装器:告别模拟器,开启无缝跨平台体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾在电脑前想要使用某个心仪的安卓…

作者头像 李华
网站建设 2026/6/24 7:14:59

强化学习(8)--值函数近似

说明:本系列文章是我在学习了西湖大学赵世钰老师的《Mathematical Foundations of Reinforcement Learning》一书后的学习笔记,在B站上有赵老师的完整课程视频。 课程视频链接 PDF教材链接 本文代码链接 一、从表格到函数 之前我们都是用表格的方法来…

作者头像 李华
网站建设 2026/6/24 8:01:13

设计稿发出去之后:一次让我想辞职的颜色噩梦

甲方说"这不是我要的蓝",我看了一眼,想死 周一早上九点,甲方总监发来微信:“这个蓝色不对,不是我们品牌色。” 我把设计稿放大到300%,盯着那个#2B5C8A看了足足十秒——这是我用取色器从甲方品牌手…

作者头像 李华
网站建设 2026/6/24 8:25:10

SwiftUI 波浪动画与图像同步

在开发移动应用时,动画效果常常是提升用户体验的重要元素。本文将介绍如何在 SwiftUI 中实现一个波浪动画,同时让图像与波浪同步移动,创建一个看起来像在水面上漂浮的效果。 问题描述 我们希望在一个波浪动画中,图像能够随着波浪的起伏移动,而不是像背景图一样固定在屏幕…

作者头像 李华
网站建设 2026/6/24 8:23:19

Keil5嵌入式开发启示:Graphormer模型在MCU上的极限压缩与部署探索

Keil5嵌入式开发启示:Graphormer模型在MCU上的极限压缩与部署探索 1. 前沿技术背景 在嵌入式AI领域,将大模型部署到资源受限设备一直是极具挑战性的课题。传统认知中,像Graphormer这样的图神经网络需要GPU级别的算力支持。但最近的技术突破…

作者头像 李华