如何通过TypeScript面试:常见问题
TypeScript已牢固确立为现代Web开发中最热门的工具之一。如果你正在准备技术面试,掌握TypeScript的基础知识和进阶特性是必备条件。本文将解析面试中常被问到的核心问题,并通过代码示例强化知识点。
1. 基础类型及其与JavaScript的区别
面试中一定会问到TypeScript的基础类型及其行为特性。与JavaScript的主要区别在于静态类型。我们来看看关键点。
1.1. 原始类型:string, number, boolean
TypeScript增加了显式类型注解。例如:
let name: string = 'Anna';let age: number = 30;let isActive: boolean = true;如果没有注解,TypeScript会自动推断类型(类型推断)。
1.2. any和unknown类型
any会关闭类型检查——最好避免使用。unknown是更安全的替代方案,需要在使用前进行类型检查:
let data: unknown = 'string';// console.log(data.toUpperCase()); // 报错!if (typeof data === 'string') { console.log(data.toUpperCase()); // 正常}1.3. never和void
void— 函数不返回任何值。never— 函数永远不会结束(抛出错误或无限循环)。
function throwError(msg: string): never { throw new Error(msg);}2. 接口与类型(interface vs type)
这是最常见的问题之一。两种机制都能描述对象结构,但存在差异。
2.1. 何时使用interface
- 声明对象和类的契约。
- 支持扩展(声明合并):
interface User { name: string;}interface User { age: number;}// 现在User包含name和age2.2. 何时使用type
- 用于联合类型、交叉类型和原始类型别名。
- 不支持声明合并。
type Status = 'active' | 'inactive';type Person = { name: string } & { age: number };面试问题:"interface能否被type替代?" — 可以,但对于类和扩展场景,interface更优。
3. 泛型
泛型允许创建可处理任意类型的可复用组件。这是高级职位的必考点。
3.1. 简单泛型函数
function firstElement<T>(arr: T[]): T { return arr[0];}const num = firstElement([1, 2, 3]); // numberconst str = firstElement(['a', 'b']); // string3.2. 泛型约束(extends)
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key];}const user = { name: 'Ivan', age: 25 };console.log(getProperty(user, 'name')); // Ivan3.3. 接口中的泛型
interface Repository<T> { getById(id: number): T; save(item: T): void;}常被问到:"既然有any,为什么还需要泛型?" — 泛型能保持类型安全。
4. 工具类型与高级特性
内置工具类型(Partial, Required, Pick, Omit)能体现对TypeScript的深入理解。
4.1. Partial和Required
interface Task { title: string; done: boolean;}const partialTask: Partial<Task> = { title: 'Learn TypeScript' };const requiredTask: Required<Task> = { title: 'Learn TypeScript', done: false };