TypeScript 5.0+面试题,我被问到的那些问题。

本文整理面试中常见的TypeScript问题,包括基础类型、高级类型、泛型、装饰器、性能优化,以及我的回答思路。

一、基础类型

1. 问题一:any和unknown的区别

第一个问题:any和unknown的区别。

回答思路:

  • any:放弃类型检查,任何值都可以赋给any,any也可以赋给任何类型
  • unknown:类型安全的any,任何值都可以赋给unknown,但unknown不能直接赋给其他类型,需要类型断言或类型收窄
  • unknown更安全,推荐用unknown代替any

回答,要讲清区别。

2. 问题二:never和void的区别

第二个问题:never和void的区别。

回答思路:

  • never:永远不会有返回值的函数,比如抛出异常、无限循环
  • void:没有返回值,或者返回undefined
  • never是底部类型,是所有类型的子类型
  • void表示没有返回值

回答,要讲清区别。

3. 问题三:interface和type的区别

第三个问题:interface和type的区别。

回答思路:

  • interface:只能定义对象类型,可以合并声明,可以继承
  • type:可以定义任何类型,包括联合类型、交叉类型、元组等,不能合并声明
  • 推荐用interface定义对象,用type定义其他类型

回答,要讲清区别。

4. 问题四:可选链和空值合并

第四个问题:可选链和空值合并。

回答思路:

  • 可选链?.:安全访问属性,不存在返回undefined
  • 空值合并??:左边为null或undefined时用右边的值
  • 是ES2020的特性,TypeScript支持

回答,要讲清用法。

5. 问题五:类型断言

第五个问题:类型断言。

回答思路:

  • 类型断言:告诉编译器我知道这个值的类型
  • 语法:value as Type 或 <Type>value
  • 不要滥用,尽量用类型收窄

回答,要讲清用法。

二、高级类型

1. 问题一:联合类型和交叉类型

第一个问题:联合类型和交叉类型。

回答思路:

  • 联合类型A | B:是A或B
  • 交叉类型A & B:同时是A和B
  • 联合类型用|,交叉类型用&

回答,要讲清区别。

2. 问题二:条件类型

第二个问题:条件类型。

回答思路:

  • 条件类型:T extends U ? X : Y
  • 根据条件选择类型
  • 很强大,是高级类型的基础

回答,要讲清用法。

3. 问题三:映射类型

第三个问题:映射类型。

回答思路:

  • 映射类型:遍历已有类型的属性,创建新类型
  • 比如Partial、Required、Readonly
  • 用in操作符遍历

回答,要讲清用法。

4. 问题四:模板字面量类型

第四个问题:模板字面量类型。

回答思路:

  • TypeScript 4.1引入
  • 用模板字符串语法定义类型
  • 比如${string}_id
  • 很强大

回答,要讲清用法。

5. 问题五:infer关键字

第五个问题:infer关键字。

回答思路:

  • infer:在条件类型中推断类型
  • 比如ReturnType、Parameters
  • 是高级类型的关键

回答,要讲清用法。

三、泛型

1. 问题一:什么是泛型

第一个问题:什么是泛型。

回答思路:

  • 泛型:类型参数化
  • 可以在定义时不指定类型,使用时指定
  • 提高复用性和类型安全
  • 是TypeScript的核心

回答,要讲清概念。

2. 问题二:泛型约束

第二个问题:泛型约束。

回答思路:

  • 泛型约束:用extends限制泛型的范围
  • 比如<T extends {length: number}>
  • 保证泛型有某些属性或方法

回答,要讲清用法。

3. 问题三:默认泛型参数

第三个问题:默认泛型参数。

回答思路:

  • 泛型可以有默认值
  • 比如<T = string>
  • 使用时可以不指定,用默认值

回答,要讲清用法。

4. 问题四:泛型和any的区别

第四个问题:泛型和any的区别。

回答思路:

  • 泛型:保留类型信息,类型安全
  • any:放弃类型检查,不安全
  • 推荐用泛型代替any

回答,要讲清区别。

5. 问题五:泛型的常见应用

第五个问题:泛型的常见应用。

回答思路:

  • 函数泛型
  • 类泛型
  • 接口泛型
  • 工具类型
  • 很广泛

回答,要讲清应用。

四、TypeScript 5.0新特性

1. 问题一:装饰器

第一个问题:装饰器。

回答思路:

  • TypeScript 5.0正式支持ECMAScript装饰器
  • 和之前的实验性装饰器不同
  • 用@decorator语法
  • 是新特性

回答,要讲清新特性。

2. 问题二:const类型参数

第二个问题:const类型参数。

回答思路:

  • TypeScript 5.0引入
  • 用const修饰泛型参数
  • 推断为字面量类型
  • 是新特性

回答,要讲清新特性。

3. 问题三:枚举的改进

第三个问题:枚举的改进。

回答思路:

  • TypeScript 5.0改进了枚举
  • 所有枚举都是联合枚举
  • 性能更好
  • 是新特性

回答,要讲清新特性。

4. 问题四:速度提升

第四个问题:速度提升。

回答思路:

  • TypeScript 5.0编译速度提升
  • 用了新的架构
  • 更快
  • 是新特性

回答,要讲清新特性。

5. 问题五:其他新特性

第五个问题:其他新特性。

回答思路:

  • 支持export type *
  • 改进了JSDoc
  • 改进了类型推断
  • 是新特性

回答,要讲清新特性。

五、类型体操

1. 问题一:实现Partial

第一个问题:实现Partial。

回答思路:

  • Partial:把所有属性变成可选
  • 实现:type MyPartial<T> = { [K in keyof T]?: T[K] }
  • 用映射类型

回答,要写代码。

2. 问题二:实现Pick

第二个问题:实现Pick。

回答思路:

  • Pick:选择部分属性
  • 实现:type MyPick<T, K extends keyof T> = { [P in K]: T[P] }
  • 用映射类型和泛型约束

回答,要写代码。

3. 问题三:实现ReturnType

第三个问题:实现ReturnType。

回答思路:

  • ReturnType:获取函数返回值类型
  • 实现:type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never
  • 用条件类型和infer

回答,要写代码。

4. 问题四:实现DeepReadonly

第四个问题:实现DeepReadonly。

回答思路:

  • DeepReadonly:深度只读
  • 递归实现
  • 用条件类型和映射类型

回答,要写代码。

5. 问题五:类型体操的意义

第五个问题:类型体操的意义。

回答思路:

  • 类型体操:复杂的类型操作
  • 提升类型能力
  • 但不要过度使用
  • 实用为主

回答,要讲清意义。

六、工程实践

1. 问题一:tsconfig配置

第一个问题:tsconfig配置。

回答思路:

  • strict:开启严格模式
  • target:编译目标
  • module:模块系统
  • outDir:输出目录
  • 是基础

回答,要讲清配置。

2. 问题二:类型声明文件

第二个问题:类型声明文件。

回答思路:

  • .d.ts文件
  • 为JS库提供类型
  • 可以自己写
  • 可以用@types
  • 是工程实践

回答,要讲清用法。

3. 问题三:类型和运行时

第三个问题:类型和运行时。

回答思路:

  • TypeScript类型在编译时擦除
  • 运行时没有类型
  • 不要依赖类型做运行时判断
  • 要用typeof、instanceof

回答,要讲清区别。

4. 问题四:性能优化

第四个问题:性能优化。

回答思路:

  • 避免复杂的类型体操
  • 合理使用project references
  • 增量编译
  • 是工程实践

回答,要讲清优化。

5. 问题五:和JavaScript共存

第五个问题:和JavaScript共存。

回答思路:

  • 可以逐步迁移
  • 用allowJs
  • 用checkJs
  • 是工程实践

回答,要讲清迁移。

七、我的面试经验

1. 经验一:基础要扎实

第一个经验:基础要扎实。

  • 基础类型
  • 高级类型
  • 泛型
  • 要扎实
  • 是基础

基础,要扎实。

2. 经验二:要动手写

第二个经验:要动手写。

  • 不要只看
  • 要动手写类型
  • 做类型体操
  • 是经验

动手写,是经验。

3. 经验三:理解原理

第三个经验:理解原理。

  • 理解类型系统原理
  • 理解编译原理
  • 理解类型擦除
  • 是经验

理解原理,是经验。

4. 经验四:关注新特性

第四个经验:关注新特性。

  • TypeScript更新快
  • 要关注新特性
  • 比如5.0的装饰器
  • 是经验

关注新特性,是经验。

5. 经验五:工程实践

第五个经验:工程实践。

  • 要有工程经验
  • tsconfig配置
  • 类型声明
  • 性能优化
  • 是经验

工程实践,是经验。

八、写在最后

TypeScript 5.0+面试题,我被问到的那些问题。

基础类型:any和unknown、never和void、interface和type、可选链和空值合并、类型断言。高级类型:联合类型和交叉类型、条件类型、映射类型、模板字面量类型、infer关键字。泛型:什么是泛型、泛型约束、默认泛型参数、泛型和any的区别、泛型的常见应用。TypeScript 5.0新特性:装饰器、const类型参数、枚举的改进、速度提升、其他新特性。类型体操:实现Partial、实现Pick、实现ReturnType、实现DeepReadonly、类型体操的意义。工程实践:tsconfig配置、类型声明文件、类型和运行时、性能优化、和JavaScript共存。

2023年了,TypeScript越来越流行,面试中经常问到。基础要扎实,要动手写,要理解原理,要关注新特性,要有工程实践。

最后,用一句话总结:"TypeScript面试,基础要扎实,高级类型要懂,泛型要用好,新特性要关注,工程实践要有。动手写,多练习,才能通过面试。"

希望我的面试题整理,能帮你准备TypeScript面试,拿到心仪的offer。