TypeScript - 模板字面量类型
从 TypeScript 4.1 开始,你可以使用一种非常强大的特性 —— 模板字面量类型(Template Literal Types),它让你可以在类型层面上使用字符串模板。听起来是不是很酷?这个功能可以帮助你基于已有的字符串类型拼接出新的字符串类型,类似于你在 JavaScript 中使用的模板字符串 ${}
,但用在了类型定义上。
基本语法
模板字面量类型的语法与 JavaScript 的模板字符串类似,使用反引号定义,并通过 ${}
结构插入动态值。例如:
type Greeting = `Hello, ${string}`;
这表示 Greeting
类型可以是任何以 "Hello, "
开头、后面接任意字符串的类型,例如:
"Hello, Alice"
"Hello, Bob"
"Hello, 123"
这些都是 Greeting
类型的有效值。
示例:与联合类型结合使用
你可以将模板字面量类型与联合类型结合,生成多个字符串组合:
type Colors = "red" | "blue";
type Shades = "light" | "dark";
type ColorShades = `${Shades}-${Colors}`;
这会得到如下联合类型:
type ColorShades =
| "light-red"
| "light-blue"
| "dark-red"
| "dark-blue";
非常适合用来生成样式类名、状态名等结构化字符串类型。
示例:条件字符串模式
模板字面量类型还可以和条件类型、映射类型等高级类型配合使用,实现更复杂的逻辑。例如:
type Status = "loading" | "success" | "error";
type StatusMessage<T extends Status> = `${T}Status`;
function printStatus<T extends Status>(status: T): StatusMessage<T> {
return `${status} Status` as StatusMessage<T>;
}
const loadingMessage = printStatus("loading");
console.log(loadingMessage);