TypeScript 中的模板字符串类型是一个强大的特性,可以用于创建复杂的字符串操作类型。以下是一些实际应用案例:

  1. URL 路径参数类型

创建一个类型,可以从 URL 模板中提取参数:

type ExtractPathParams<T extends string> = 
  T extends `${string}:${infer Param}/${infer Rest}`
    ? Param | ExtractPathParams<Rest>
    : T extends `${string}:${infer Param}`
      ? Param
      : never;
 
type Params = ExtractPathParams<'/users/:id/posts/:postId'>;
// 类型为 "id" | "postId"
  1. 对象属性路径类型

创建一个类型,表示对象属性的访问路径:

type PropPath<T, K extends keyof T = keyof T> = 
  K extends string
    ? T[K] extends object
      ? `${K}.${PropPath<T[K]>}` | K
      : K
    : never;
 
interface User {
  name: string;
  address: {
    street: string;
    city: string;
  };
}
 
type UserPaths = PropPath<User>;
// 类型为 "name" | "address" | "address.street" | "address.city"
  1. 字符串操作函数类型

为常见的字符串操作创建类型安全的函数:

type Trim<T extends string> = T extends ` ${infer R}` | `${infer R} ` ? Trim<R> : T;
type TrimLeft<T extends string> = T extends ` ${infer R}` ? TrimLeft<R> : T;
type TrimRight<T extends string> = T extends `${infer R} ` ? TrimRight<R> : T;
 
type TrimmedHello = Trim<'  Hello World  '>; // 'Hello World'
type LeftTrimmedHello = TrimLeft<'  Hello World  '>; // 'Hello World  '
type RightTrimmedHello = TrimRight<'  Hello World  '>; // '  Hello World'
  1. 版本号比较类型

创建一个类型来比较语义化版本号:

type CompareVersions<V1 extends string, V2 extends string> = 
  V1 extends `${infer Major1}.${infer Minor1}.${infer Patch1}`
    ? V2 extends `${infer Major2}.${infer Minor2}.${infer Patch2}`
      ? Major1 extends Major2
        ? Minor1 extends Minor2
          ? Patch1 extends Patch2
            ? 'equal'
            : Patch1 extends `${number}`
              ? Patch2 extends `${number}`
                ? `${Patch1 extends `${Patch2}${string}` ? 'greater' : 'less'}`
                : never
              : never
          : Minor1 extends `${number}`
            ? Minor2 extends `${number}`
              ? `${Minor1 extends `${Minor2}${string}` ? 'greater' : 'less'}`
              : never
            : never
        : Major1 extends `${number}`
          ? Major2 extends `${number}`
            ? `${Major1 extends `${Major2}${string}` ? 'greater' : 'less'}`
            : never
          : never
      : never
    : never;
 
type Comparison = CompareVersions<'1.2.3', '1.2.4'>; // 'less'
  1. 驼峰命名转换类型

创建一个类型将短横线分隔的字符串转换为驼峰命名:

type CamelCase<S extends string> = 
  S extends `${infer P1}-${infer P2}${infer P3}`
    ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}`
    : Lowercase<S>;
 
type CamelCaseTest = CamelCase<'foo-bar-baz'>; // 'fooBarBaz'

这些例子展示了模板字符串类型在创建复杂字符串操作类型时的强大功能。它们可以用于类型安全的字符串处理、路径解析、版本比较等多种场景,提高了类型系统的表达能力和安全性。