MST

星途 面试题库

面试题:TypeScript 模板字面量类型在泛型约束下的字符串校验及递归应用

定义一个泛型函数,该函数接收一个字符串数组,并且数组中的每个字符串都需要满足以下规则:它是一个嵌套结构,格式类似于 'a.b.c',其中每一级名称由字母组成,并且层级数量不确定。使用 TypeScript 的模板字面量类型结合泛型约束来实现对数组中每个字符串的校验。此外,通过递归方式定义一个类型,能够根据传入的合法字符串,解析出每一级名称组成的嵌套对象类型。例如,对于字符串 'a.b.c',解析出的类型为 { a: { b: { c: true } } }。请完整编写相关的类型定义和函数实现。
43.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义一个类型来校验字符串格式
type IsValidPath<S extends string> = 
  S extends `${infer Head}.${infer Tail}`
   ? Head extends `${infer Part}`
      ? Part extends string
         ? Part extends `${infer First}${infer Rest}`
            ? First extends string
               ? First extends `[a-zA-Z]`
                  ? IsValidPath<Tail>
                   : false
                : false
             : false
          : false
       : S extends `${infer Part}`
          ? Part extends string
             ? Part extends `${infer First}${infer Rest}`
                ? First extends string
                   ? First extends `[a-zA-Z]`
                      ? true
                       : false
                    : false
                 : false
              : false;

// 递归解析字符串为嵌套对象类型
type ParsePath<S extends string> = 
  S extends `${infer Head}.${infer Tail}`
   ? { [K in Head]: ParsePath<Tail> }
    : { [K in S]: true };

// 泛型函数,接收满足格式的字符串数组并返回解析后的对象数组
function parsePaths<
  T extends string[], 
  U extends { [K in keyof T]: IsValidPath<T[K]> } = { [K in keyof T]: IsValidPath<T[K]> }
>(paths: T extends U ? T : never): { [K in keyof T]: ParsePath<T[K]> } {
  return paths.map((path) => {
    const parts = path.split('.');
    const result: any = {};
    let current = result;
    parts.forEach((part, index) => {
      if (index === parts.length - 1) {
        current[part] = true;
      } else {
        current[part] = current[part] || {};
        current = current[part];
      }
    });
    return result;
  }) as { [K in keyof T]: ParsePath<T[K]> };
}