MST

星途 面试题库

面试题:TypeScript类型系统深度优化之条件类型与映射类型的高阶应用

条件类型和映射类型是TypeScript类型系统中强大的工具。请实现一个复杂的类型工具,利用条件类型和映射类型,根据给定的对象类型,生成一个新的类型,新类型要求对原对象的所有属性值类型进行特定的转换(例如,如果原属性值类型是字符串,则转换为大写字符串类型;如果是数字,则转换为其平方类型),同时阐述此过程中可能遇到的性能瓶颈及优化策略。
29.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现类型工具

type StringToUpperCase<T extends string> = 
  T extends "" ? "" :
  `${Uppercase<T[0]>}${StringToUpperCase<T extends `${infer _}${infer Rest}` ? Rest : "">}`;

type NumberToSquare<T extends number> = T extends number ? T * T : never;

type TransformProperties<T> = {
  [K in keyof T]: T[K] extends string ? StringToUpperCase<T[K]> :
  T[K] extends number ? NumberToSquare<T[K]> :
  T[K];
};

性能瓶颈

  1. 递归深度限制:在StringToUpperCase类型中使用了递归,TypeScript有递归深度的限制。如果字符串过长,会导致类型检查失败。
  2. 类型计算复杂度:对于复杂的对象类型,映射类型和条件类型嵌套使用会导致类型计算的复杂度显著增加,特别是当对象有很多层级嵌套时,每次类型检查都需要遍历和计算所有属性,这会消耗大量的编译时间。

优化策略

  1. 避免过深递归:尽量避免在类型定义中使用过深的递归。对于字符串处理,可以考虑使用模板字符串结合条件类型来减少递归深度,例如对于较短的字符串可以直接使用模板字符串的Uppercase类型,而对于较长字符串可以采用分段处理。
  2. 减少嵌套层级:在设计对象类型时,尽量扁平化结构,减少嵌套层级。这样在应用映射类型和条件类型时,计算量会显著减少。同时可以对复杂对象进行分层转换,先对顶层属性进行转换,再递归处理嵌套对象。