查看: 99|回复: 1

TypeScript高频面试题实战:从类型基础到类型体操深入

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
TypeScript(TS)已经成为现代前端开发的标配,尤其在 React、Vue、Angular 等框架中几乎是大厂必考点。2026 年的面试趋势更注重类型安全、高级类型工具和实际项目应用。以下精选 20+ 高频面试题,按基础、中级、高级分类,附带详细解答和代码示例,适合结合项目实战记忆。

一、基础篇:理解 TS 核心价值

1. TypeScript 与 JavaScript 的区别

TypeScript 是 JavaScript 的超集(superset),由 Microsoft 开发,编译为纯 JS 运行。主要区别:
- TS 支持静态类型检查,在编译时捕获错误;JS 是动态类型,错误在运行时暴露。
- TS 提供了接口、泛型、枚举、装饰器等面向对象特性。
- TS 需要编译(使用 tsc 命令),JS 可以直接运行。
- TS 能提升代码可维护性和 IDE 智能提示,但增加了学习成本。

大厂项目青睐 TS 的原因:类型安全减少运行时 bug;IDE 支持重构(重命名、跳转、自动补全);类型作为“文档”明确接口契约;React/Vue/Angular 官方推荐;大型项目代码量失控时,纯 JS 难以维护。

2. 基本类型与特殊类型

原始类型:boolean、number、string、null、undefined、symbol、bigint、void。
对象类型:object、array、tuple(元组)、enum(枚举)。
特殊类型:any(任意,关闭类型检查,不推荐)、unknown(未知,安全版 any)、never(永不存在的值)。
  1. let isDone: boolean = false;
  2. let num: number = 6;
  3. let str: string = 'hello';
  4. let list: number[] = [1, 2, 3]; // 或 Array<number>
  5. let tuple: [string, number] = ['hello', 10]; // 元组
复制代码

3. any、unknown、never 的区别

any:任意类型,关闭类型检查,适合迁移旧 JS 项目时临时绕过,但安全性低。
unknown:未知类型,必须先进行类型收窄才能操作,适合 API 返回不确定类型时使用。
never:永不存在的值,常用于抛出错误的函数或类型推断的底部。
  1. let val: unknown = 'hello';
  2. if (typeof val === 'string') { // 类型收窄
  3.   console.log(val.toUpperCase());
  4. }
复制代码

二、中级篇:实际编码能力考察

1. interface 与 type 的区别

interface 主要用于定义对象类型,支持声明合并(同名接口自动合并),推荐用于对象/接口定义。type 支持联合、元组、原始类型别名,支持交叉类型(&)扩展,但不能声明合并。
  1. interface User { name: string; }
  2. interface User { age?: number; } // 自动合并
  3. type ID = string | number;
  4. type A = { a: string };
  5. type B = { b: number };
  6. type C = A & B; // { a: string; b: number }
复制代码

2. 泛型的应用场景

泛型允许创建可复用组件,支持类型参数化。常见场景:数组工具函数、Promise、React 组件 props、Vue 的 defineProps 等。
  1. function identity<T>(arg: T): T {
  2.   return arg;
  3. }
  4. let output = identity<string>('hello'); // T 推断为 string
复制代码

3. 联合类型与交叉类型

联合类型(|):值可以是其中一种类型,例如 string | number。
交叉类型(&):值必须同时满足所有类型,常用于对象合并。

4. 类型收窄的常用方式

- typeof 检查原始类型
- instanceof 检查实例
- in 检查属性
- 字面量类型守卫(===)
- 自定义类型守卫(is 关键字)
  1. function padLeft(value: string, padding: string | number) {
  2.   if (typeof padding === 'number') {
  3.     return Array(padding + 1).join(' ') + value; // padding 被收窄为 number
  4.   }
  5.   return padding + value;
  6. }
复制代码

三、高级篇:类型体操与配置

1. 常用工具类型(Utility Types)

- Partial<T>:所有属性可选
- Required<T>:所有属性必选
- Readonly<T>:所有属性只读
- Pick<T, K>:挑选属性
- Omit<T, K>:排除属性
- Record<K, T>:键为 K,值为 T 的对象
- Exclude<T, U> / Extract<T, U>:联合类型排除/提取
  1. type User = { name: string; age: number };
  2. type PartialUser = Partial<User>; // { name?: string; age?: number }
复制代码

2. 条件类型(Conditional Types)

通过 T extends U ? X : Y 实现条件判断。
  1. type IsString<T> = T extends string ? 'yes' : 'no';
  2. type Test1 = IsString<'hello'>; // 'yes'
复制代码

3. 映射类型(Mapped Types)

通过 [K in keyof T] 遍历键创建新类型。
  1. type Optional<T> = { [P in keyof T]?: T[P] }; // 等价于 Partial<T>
复制代码

4. tsconfig.json 关键配置

target:编译目标(如 es2020)
module:模块系统(如 esnext/commonjs)
strict:开启所有严格检查(强烈推荐)
noImplicitAny:隐式 any 报错
strictNullChecks:null/undefined 严格检查
esModuleInterop:更好地导入 CommonJS 模块
skipLibCheck:跳过库类型检查,加速编译

四、实战应用题:框架相关高频问题

1. React/Vue 项目中如何使用 TypeScript?

React:使用 .tsx 文件,用 interface 或 type 定义 props 类型,useState() 自动推断类型。
Vue:使用 Vue 3 + TS,在 <script setup lang="ts"> 中通过 defineProps() 定义 props 类型。

2. 第三方库缺少类型定义怎么办?

优先安装 @types/库名(来自 DefinitelyTyped)。如果没有,可以使用 declare module '库名' 声明模块。万不得已时用 any 断言,但非常不推荐。

五、面试建议

准备一个基于 TS 的 React/Vue 个人项目,面试时能举例说明类型如何提升代码质量。平时多练习类型体操(可参考 Type Challenges 或 LeetCode TS 版)。关注 TS 新特性,如 5.x 的 const type parameters、infer 改进等。以上内容覆盖了 95% 以上的大厂考察点,背熟并理解原理,TS 面试基本稳固。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: TypeScript高频面试题实战:从类型基础到类型体操深入

楼主整理得很全面,基础到高级的脉络清晰,面试复习按照这个框架走确实能事半功倍。尤其喜欢你把 any、unknown、never 的对比和类型收窄的常见方式单独拎出来,这些都是实际编码中最容易踩坑的地方。 想请教一下,高级篇里条件类型和映射类型都提到了,但没看到模板字面量类型(Template Literal Types)。最近在写一些与路由类型推导相关的逻辑时用到了 `${K}` 这类模式,比如把字符串联合字面量映射成另一种字符串。楼主觉得这类类型在面试中出现的频率高吗?或者有什么推荐的实战场景?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-11 21:06 , Processed in 0.032062 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部