Skip to main content

TypeScript 面试题全集(含答案解析)

🌱 一、基础语法与类型系统

1. TypeScript 中的基础类型有哪些?请举例说明。

  • 回答:包括 numberstringbooleannullundefinedsymbolbigintvoidanyunknownnever
  • 示例
let age: number = 25;
let name: string = "张三";
let flag: boolean = true;

2. anyunknownnever 区别?

  • any: 放弃类型检查,绕过 TS 的类型保护。
  • unknown: 安全的任意类型,使用前需做类型判断。
  • never: 表示不可能存在的值,例如函数抛异常或死循环。

3. voidundefined 区别?

  • void: 函数无返回值。
  • undefined: 实际是一个值,可赋值使用。

4. 什么是字面量类型?

  • 回答:指定变量只能是某些确定的值。
let direction: "left" | "right" = "left";

5. 类型断言写法?

const a = someValue as string;
const b = <string>someValue;

🧩 二、类型体操与泛型

6. type vs interface 区别

  • interface 可合并声明、可被类实现。
  • type 更灵活,支持联合、交叉、条件类型等。

7. interface 能否定义联合类型?

  • 不能,type 才支持联合:
type A = { a: number } | { b: string };

8. key 工具类型示例

type Keys = keyof { a: string; b: number }; // "a" | "b"
type ReadonlyAll<T> = { readonly [K in keyof T]: T[K] };

9. 泛型函数

function identity<T>(arg: T): T {
return arg;
}

10. 泛型约束

function getLength<T extends { length: number }>(x: T): number {
return x.length;
}

🧠 三、常见手写工具类型

11. 实现 Partial<T>

type MyPartial<T> = {
[P in keyof T]?: T[P];
};

12. 实现 Pick<T, K>

type MyPick<T, K extends keyof T> = {
[P in K]: T[P];
};

13. 实现 Omit<T, K>

type MyOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

14. 实现 DeepReadonly<T>

type DeepReadonly<T> = {
readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
};

🏗 四、实战类型应用

15. Axios 响应类型封装

interface ApiResponse<T> {
code: number;
data: T;
message: string;
}

16. Redux 状态类型定义

interface State {
user: {
name: string;
age: number;
};
loading: boolean;
}

17. React 中 props 泛型

interface Props<T> {
data: T;
onSelect: (item: T) => void;
}

🚨 五、类型推断与陷阱

18. 推断区别

const a = [1, 2, 3]; // number[]
const b: number[] = [1, 2, 3]; // number[]
const c = [1, "2", true]; // (string | number | boolean)[]

19. as const 的作用

  • 把对象所有属性标记为 readonly 和精确字面量类型。

20. infer 使用

type ReturnType<T> = T extends (...args: any) => infer R ? R : any;

🔥 六、挑战类型题

21. 实现 Flatten<T>

type Flatten<T extends any[]> = T extends [infer F, ...infer R]
? F extends any[]
? [...Flatten<F>, ...Flatten<R>]
: [F, ...Flatten<R>]
: [];

22. 实现 IsUnion<T>

type IsUnion<T, C = T> = T extends any ? ([C] extends [T] ? false : true) : never;

23. 实现 TupleToUnion<T>

type TupleToUnion<T extends any[]> = T[number];

📘 七、TS 最佳实践

24. tsconfig 推荐配置

{
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"esModuleInterop": true,
"skipLibCheck": true
}

25. 声明模块文件 d.ts

declare module "*.svg" {
const content: string;
export default content;
}

如需继续补充 TypeScript 类型体操 进阶题、结合 React Hooks 类型使用、项目实战案例、常见源码解析,欢迎继续提问~