在TypeScript中,校验路径字符串的有效性可以通过类型体操来实现。路径字符串通常指的是文件路径或URL路径,我们需要确保路径字符串符合一定的格式要求。以下是一个简单的示例,展示如何使用TypeScript的类型系统来校验路径字符串的有效性。
假设我们有以下规则:
- 路径必须以 /
开头。
- 路径不能包含连续的 /
。
- 路径不能包含非法字符(如空格、特殊符号等)。
TypeScript 4.1 引入了模板字面量类型,我们可以利用它来定义路径字符串的格式。
type ValidPath<T extends string> =
T extends `/${infer Rest}`
? Rest extends `${infer Part}/${infer RestParts}`
? Part extends ""
? never // 连续的 `/`
: ValidPath<`/${RestParts}`>
: T
: never;
type IsValidPath<T extends string> = T extends ValidPath<T> ? true : false;
// 测试用例
type Test1 = IsValidPath<"/valid/path">; // true
type Test2 = IsValidPath<"/invalid//path">; // false
type Test3 = IsValidPath<"invalid/path">; // false
type Test4 = IsValidPath<"/path/with/space ">; // false
ValidPath<T>
是一个递归类型,它检查路径字符串是否符合规则。
T extends
/${infer Rest}:确保路径以
/` 开头。Rest extends
${infer Part}/${infer RestParts}`:递归检查路径的每一部分。Part extends ""
:如果部分路径为空(即连续的 /
),则返回 never
,表示无效路径。IsValidPath<T>
是一个辅助类型,用于判断路径是否有效。function validatePath<T extends string>(path: T & ValidPath<T>): void {
console.log(`Path "${path}" is valid.`);
}
validatePath("/valid/path"); // 正常
validatePath("/invalid//path"); // 报错:类型 '"/invalid//path"' 不能赋值给类型 'never'
validatePath("invalid/path"); // 报错:类型 '"invalid/path"' 不能赋值给类型 'never'
如果需要更复杂的校验规则(如允许特定字符、限制路径长度等),可以进一步扩展 ValidPath
类型。
type ValidPath<T extends string> =
T extends `/${infer Rest}`
? Rest extends `${infer Part}/${infer RestParts}`
? Part extends ""
? never // 连续的 `/`
: Part extends `${infer Char}${infer RestChars}`
? Char extends " " | "?" | "&" | "="
? never // 包含非法字符
: ValidPath<`/${RestParts}`>
: ValidPath<`/${RestParts}`>
: T
: never;
通过使用TypeScript的模板字面量类型和递归类型,我们可以实现路径字符串的有效性校验。这种方法可以在编译时捕获无效的路径字符串,从而提高代码的健壮性。