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。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录