插件窝 干货文章 TypeScript类型体操如何校验路径字符串的有效性?

TypeScript类型体操如何校验路径字符串的有效性?

路径 extends 类型 字符串 480    来源:    2025-03-19

在TypeScript中,校验路径字符串的有效性可以通过类型体操来实现。路径字符串通常指的是文件路径或URL路径,我们需要确保路径字符串符合一定的格式要求。以下是一个简单的示例,展示如何使用TypeScript的类型系统来校验路径字符串的有效性。

1. 定义路径字符串的基本规则

假设我们有以下规则: - 路径必须以 / 开头。 - 路径不能包含连续的 /。 - 路径不能包含非法字符(如空格、特殊符号等)。

2. 使用模板字面量类型进行校验

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

3. 解释

  • ValidPath<T> 是一个递归类型,它检查路径字符串是否符合规则。
    • T extends/${infer Rest}:确保路径以/` 开头。
    • Rest extends${infer Part}/${infer RestParts}`:递归检查路径的每一部分。
    • Part extends "":如果部分路径为空(即连续的 /),则返回 never,表示无效路径。
  • IsValidPath<T> 是一个辅助类型,用于判断路径是否有效。

4. 使用示例

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'

5. 进一步扩展

如果需要更复杂的校验规则(如允许特定字符、限制路径长度等),可以进一步扩展 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的模板字面量类型和递归类型,我们可以实现路径字符串的有效性校验。这种方法可以在编译时捕获无效的路径字符串,从而提高代码的健壮性。