interview
typescript-frontend
什么是 TypeScript 的模板字面量类型

前端 TypeScript 面试题, 什么是 TypeScript 的模板字面量类型?

前端 TypeScript 面试题, 什么是 TypeScript 的模板字面量类型?

QA

Step 1

Q:: 什么是 TypeScript 的模板字面量类型?

A:: TypeScript 的模板字面量类型(Template Literal Types)是基于字符串字面量的类型,允许通过在模板字面量中嵌入其他类型来创建复杂的字符串类型。例如,type Greeting = Hello, ${string}``; 定义了一个可以匹配以 'Hello, ' 开头并跟随任意字符串的类型。这种类型在处理字符串模式匹配和构建复杂类型时非常有用。

Step 2

Q:: 如何使用模板字面量类型来构造新的字符串类型?

A:: 模板字面量类型可以用来构造新的字符串类型,比如将多个字符串字面量类型组合成一个新的类型。举个例子:type Event = 'click' | 'scroll' | 'mousemove'; type EventHandler = on${Capitalize<Event>}``; 这个例子构建了 'onClick', 'onScroll', 'onMousemove' 这样的字符串类型。

Step 3

Q:: TypeScript 中的 infer 关键字是什么?如何与模板字面量类型配合使用?

A:: infer 关键字用于在条件类型中推断类型变量的类型。在模板字面量类型中,infer 可以与条件类型结合使用,用于提取模板字面量中的某部分。例如,type ExtractPrefix<T> = T extends ${infer Prefix}_${string}`` ? Prefix : never; 这个类型定义提取以某个前缀加下划线开头的字符串的前缀部分。

Step 4

Q:: 模板字面量类型如何与其他高级类型特性结合使用?

A:: 模板字面量类型可以与 TypeScript 的条件类型、映射类型、联合类型等特性结合使用。例如,你可以通过模板字面量类型和条件类型来实现对字符串联合类型的模式匹配或过滤。type Filtered<T extends string> = T extends on${infer Rest}`` ? Rest : never; 这个例子过滤掉了所有以 'on' 开头的字符串类型。

用途

TypeScript 的模板字面量类型是一种强大且灵活的类型系统增强特性,特别适合在需要复杂字符串处理和模式匹配的场景中使用。它们在定义 API 类型、校验字符串格式、动态生成类型等方面非常有用。例如,在一个大型前端项目中,可能需要根据字符串模式自动生成事件处理函数的名称或生成 API 请求的路径。在这些情况下,使用模板字面量类型可以极大地提高代码的类型安全性和可维护性。\n

相关问题

🦆
什么是 TypeScript 的条件类型?

条件类型是一种根据条件选择不同类型的类型工具。语法类似于 JavaScript 中的三元运算符。例如,type IsString<T> = T extends string ? true : false; 这个条件类型判断一个类型是否为字符串类型,并返回对应的布尔值类型。

🦆
如何在 TypeScript 中使用映射类型?

映射类型允许你创建一个基于另一个类型的变换类型。你可以通过对已有类型中的每个属性应用一个转换来构建新的类型。例如,type Readonly<T> = { readonly [P in keyof T]: T[P] }; 将一个对象类型的所有属性设置为只读。

🦆
TypeScript 中的 keyof 和 typeof 有什么区别?

keyof 用于获取一个对象类型的所有键名组成的联合类型,而 typeof 用于获取一个变量或表达式的类型。例如,type Keys = keyof {a: string, b: number}; 返回 'a' | 'b'let x = 5; type XType = typeof x; 返回 number 类型。

🦆
在 TypeScript 中,如何定义可选属性和默认参数?

可选属性可以通过在属性名后加 ? 来定义,如 interface User { name?: string; }。默认参数在函数定义中通过 = 号指定,如 function greet(name: string = 'User') {},未传入时使用默认值。