自定义 Hooks 设计模式与闭包陷阱
面试向讲清自定义 Hook:本质与三条硬规则、返回值与参数的接口设计、SSR 安全与清理、 useDebounce / useLatest / useInterval / useRequest 四个高频手写实现, 以及过期闭包的四种解法(函数式更新 / 依赖数组 / useRef / useEffectEvent)与各自代价。
面试向讲清自定义 Hook:本质与三条硬规则、返回值与参数的接口设计、SSR 安全与清理、 useDebounce / useLatest / useInterval / useRequest 四个高频手写实现, 以及过期闭包的四种解法(函数式更新 / 依赖数组 / useRef / useEffectEvent)与各自代价。
面试向讲清 React 性能优化的完整链路:先用 Profiler 量化再动手,用状态下放与 children 提升减少渲染次数, 用 memo 三件套与虚拟列表降低单次渲染成本,用并发特性把不急的更新降级,并给出 React Compiler 时代的最新答案。
面试向讲清 Suspense 与错误边界:子组件 throw Promise 的挂起机制、fallback 与边界位置规则、 已显示内容为何会重新闪 fallback、错误边界能抓和不能抓的四类错误、use() 读取 Promise 的两个硬约束、 React 19 错误处理变化与错误边界重置方案。
面试向讲清 React 并发:为什么一次昂贵渲染会卡住输入框、useTransition 与 useDeferredValue 分别该在什么时候用、 isPending / isStale 怎么提示、与防抖节流的区别、React 19 异步 Action 的坑, 以及「输入框千万别包进 startTransition」「useDeferredValue 不减少网络请求」等高频误区。
面试向讲清 Zod:为什么 TS 类型挡不住脏数据、一份 schema 如何同时产出运行时校验器和静态类型、 parse 与 safeParse 的选型、refine / transform / discriminatedUnion 实战、Zod 4 的破坏性变更与迁移要点, 以及环境变量、接口响应、表单三处边界的落地方案。
面试向讲清 TypeScript 泛型约束与函数重载:extends 为什么是"赋能"而不是"限制"、keyof 联动约束、 多重约束与泛型默认值、重载签名与实现签名的可见性规则、自上而下的重载解析顺序, 以及"什么时候该用重载、什么时候该用联合类型"的取舍标准。
面试向讲清类型驱动开发:用判别联合让不可能的状态写不出来、用 never 做穷尽检查、unknown + 类型守卫守住外部数据边界、 品牌类型防止 ID 串用、as const + satisfies 反向推导类型,以及"类型不是运行时校验"这条不可逾越的红线。
面试向讲清现代前端框架的类型设计:Vue 的 defineProps / defineEmits / defineSlots / defineModel / generic 如何由编译器静态分析推导, React 的泛型组件、多态组件 as、ComponentPropsWithoutRef 与 React 19 ref as prop 的类型变化,以及两边共有的类型失效边界。
面试向讲清 TypeScript 装饰器:legacy 与 Stage 3 两套实现的签名差异、context 上下文、accessor 自动访问器、执行顺序、emitDecoratorMetadata 与 Symbol.metadata,以及 NestJS/Angular 的迁移现状。
面试向讲清 .d.ts:全局声明、模块声明、declare global 与模块增强怎么写,declaration 自动生成、package.json 的 types/exports 配置,以及 @types 发布路径。