// 定义一个类型来校验字符串格式
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]> };
}