📜  Typescript 中的模板字面量类型是什么?(1)

📅  最后修改于: 2023-12-03 15:05:39.510000             🧑  作者: Mango

Typescript 中的模板字面量类型是什么?

在Typescript中,模板字面量类型(Template Literal Types)是指通过模板字符串(使用反引号 `)及模板字符串中的占位符(${expression})得到的字符串类型。

模板字面量类型可以由一个或多个固定字符串文本和嵌入式表达式组成,并且嵌入式表达式可以是:

  • 类型表达式
  • 条件表达式
  • 对象字面量类型
  • 数组字面量类型
类型表达式

类型表达式可以是一个任意类型,包括原始类型、联合类型、交叉类型、变量类型、函数类型等。使用类型表达式的模板字面量类型可以根据表达式的结果推断出最终字符串类型。

type Greeting<T extends string> = `Hello, ${T}!`;

type Str1 = Greeting<'Foo'>; // 'Hello, Foo!'
type Str2 = Greeting<'Bar'>; // 'Hello, Bar!'

上述代码中,我们定义了一个 Greeting 的模板字面量类型,它接受一个字符串类型 T 作为输入,返回一个字符串类型,其中 T 被插入到字符串中间。

条件表达式

条件表达式可以用来根据条件选择不同的字符串格式。如果条件表达式为真,则选择第一个字符串;否则选择第二个字符串。

type SizeFormater<S extends 'small' | 'medium' | 'large'> =
  S extends 'small' ? 'S' :
  S extends 'medium' ? 'M' :
  'L';

type ShirtSize = SizeFormater<'medium'>; // 'M'

上述代码中,我们定义了一个 SizeFormater 的模板字面量类型,它接受一个字符串类型 S 作为输入。在 SizeFormater 内部,我们使用了条件表达式来根据输入的 S,选择不同的字符串格式作为结果。

对象字面量类型和数组字面量类型

对象字面量类型和数组字面量类型可以用来描述复杂的字符串格式,例如对象、数组等。

type Person = {
  name: string;
  age: number;
};

type GreetingMessage<P extends Person> = `Hello, my name is ${P['name']} and I am ${P['age']} years old.`;

type Message = GreetingMessage<{ name: 'Alice', age: 30 }>; // 'Hello, my name is Alice and I am 30 years old.'

上述代码中,我们定义了一个 Person 类型和一个 GreetingMessage 的模板字面量类型。在 GreetingMessage 内部,我们使用了对象字面量类型来描述 { name: 'Alice', age: 30 } 对象的格式,并且根据对象的属性插入到字符串中。

总而言之,模板字面量类型是 TypeScript 2.4 引入的新特性,可以大大增强类型系统的表达能力,让编写类型安全的代码更加容易。