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} 不是一个有效的邮箱地址`);
}