MST

星途 面试题库

面试题:TypeScript 正则表达式类型安全验证器的泛型与元编程优化

利用TypeScript的泛型和元编程能力,优化正则表达式类型安全验证器。实现一个泛型函数,它可以根据传入的正则表达式字符串,自动推导出匹配该正则表达式的字符串类型,并在编译期进行类型检查。例如传入邮箱正则,就能确保输入是合法邮箱格式的字符串类型。
32.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
type RegexMatch<T extends string> = T extends `^${infer Pattern}$`
  ? Pattern extends `${infer Head}${infer Tail}`
    ? Head extends `(`
      ? RegexMatch<`^${Tail}`>
      : Head extends `)`
        ? never
        : Head extends `|`
          ? never
          : Head extends `(`
            ? RegexMatch<`^${Tail}`>
            : Head extends `)`
              ? never
              : Head extends `*`
                ? RegexMatch<`^${Tail}`>
                : Head extends `+`
                  ? RegexMatch<`^${Tail}`>
                  : Head extends `?`
                    ? RegexMatch<`^${Tail}`>
                    : Head extends `[${infer Inner}]`
                      ? Inner extends `${infer Char}`
                        ? `${Char}${RegexMatch<`^${Tail}`>}`
                        : never
                      : Head extends `[^${infer Inner}]`
                        ? `${string & Exclude<string, Inner>}${RegexMatch<`^${Tail}`>}`
                        : `${Head}${RegexMatch<`^${Tail}`>}`
    : T
  : never;

function createRegexValidator<T extends string>(regex: RegExp): (input: string) => input is RegexMatch<T> {
    return (input: string): input is RegexMatch<T> => regex.test(input);
}

// 示例使用
const emailRegex = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
const validateEmail = createRegexValidator<"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$">(emailRegex);

let potentialEmail: string = "test@example.com";
if (validateEmail(potentialEmail)) {
    // potentialEmail 在这里会被类型推导为匹配邮箱正则的字符串类型
    console.log(`${potentialEmail} 是一个有效的邮箱地址`);
} else {
    console.log(`${potentialEmail} 不是一个有效的邮箱地址`);
}