typescript模板字面量类型在编译期通过反引号和${}推导字符串形态,支持拼接、嵌套、映射类型、const断言及infer提取,实现api路径、事件名等细粒度字符串约束。

TypeScript 的模板字面量类型(Template Literal Types)允许你基于字符串字面量进行精确建模,实现比 string 更细粒度的字符串约束。它不是运行时校验,而是在编译期通过类型系统“推导+限制”合法字符串形态,特别适合处理 API 路径、事件名、CSS 类名、枚举式字符串组合等场景。
基础语法:拼接与推导
模板字面量类型用反引号和 ${} 占位符定义,内部可嵌入字符串字面量、联合类型或其它模板字面量类型:
-
type Greeting = `Hello ${"world" | "TS"}`→ 合法值只有"Hello world"和"Hello TS" -
type Path = `/${string}/id`→ 匹配任意以/开头、以/id结尾的字符串(如"/user/id"、"/123/id") - 支持嵌套:
type StatusPath = `api/v${1 | 2}/${"users" | "posts"}`
结合映射类型与 keyof 实现动态键名约束
常用于构建强类型的配置对象或路由表,让键名符合预设模式:
type Feature = "auth" | "billing" | "analytics";
type FeatureFlag = `enable-${Feature}` | `disable-${Feature}`;
const flags: Record<featureflag boolean> = {
"enable-auth": true,
"disable-billing": false,
// "enable-chat": true // ❌ 编译错误:'enable-chat' 不在 FeatureFlag 联合中
};</featureflag>
还可进一步结合 keyof 和泛型生成键名:
type Entity = "user" | "post" | "comment";
type EntityAction = "create" | "read" | "update" | "delete";
type ApiEndpoint<t extends entity> = {
[K in EntityAction as `${K}-${T}`]: `/${T}s/${K}`;
};
type UserEndpoints = ApiEndpoint
// → { "create-user": "/users/create"; "read-user": "/users/read"; ... }</t>
运行时字符串转编译期字面量:借助 const 断言
模板字面量类型依赖字面量推断。若从变量构造,需用 as const 防止类型被拓宽为 string:
-
const prefix = "v" as const;→ 类型是"v",不是string -
type Versioned = `${typeof prefix}${1 | 2 | 3}`→ 得到"v1" | "v2" | "v3" - 数组也适用:
const methods = ["GET", "POST"] as const;→typeof methods[number]是"GET" | "POST"
高级技巧:提取与条件推导
配合 infer 可从模板字面量中提取子串,实现类似正则的“捕获”效果:
type ExtractId<s extends string> = S extends `user-${infer Id}` ? Id : never;
type UserId = ExtractId // → "abc123"
type Bad = ExtractId // → never</s>
再结合条件类型,可构建“字符串分类器”:
type RouteType<r extends string> =
R extends `/api/${infer Rest}` ? `API: ${Rest}` :
R extends `/static/${infer Rest}` ? `STATIC: ${Rest}` :
`UNKNOWN: ${R}`;
type T1 = RouteType // → "API: users"
type T2 = RouteType // → "STATIC: logo.png"</r>
不复杂但容易忽略:模板字面量类型本质是编译期计算,不能包含变量表达式(如 ${i + 1}),所有内容必须能在类型层面静态确定。合理组合字面量、联合、映射和 infer,就能把字符串约束做到非常精准的程度。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











