头图

想要把字符串数组转换为字符串字面量联合类型,可以先使用as const关键字定义只读字符串数组,然后对数组中的全部值使用typeof操作符。

// 只读的字符串数组
const namesArr = ["John", "Lily", "Roy"] as const;

// 把数组转换为字符串字面量联合类型
type Names = typeof namesArr[number]; // "John" | "Lily" | "Roy"

这可能需要一些时间去理解发生了什么。因此让我带你一步一步地分析:
第一步,初始化字符串数组

// 字符串数组
const namesArr = ["John", "Lily", "Roy"];

我们的目标是把它转换为字符串字面量联合类型
接着,在TypeScript中必须使用as const关键字才能把数组转换为只读的在各个方面都是常量的数组。
就像这样做:

// 只读的字符串数组
const namesArr = ["John", "Lily", "Roy"] as const;

把字符串数组转换为只读模式之后,就不能在使用常规的push, pop, slice等数组方法。它在各个方面都是一个常数
然后,我们需要把只读的数组转换为字符串字面量联合类型。
为此我们定义一个叫做Names的新类型,然后对namesArr数组的全部值都是用typeof操作符。
如下所示:

// 只读的字符串数组
const namesArr = ["John", "Lily", "Roy"] as const;

// 把数组转换为字符串字面量联合类型
type Names = typeof namesArr[number]; // "John" | "Lily" | "Roy"

现在你可能会问我们为什么对namesArr使用number类型,这就是告诉TypeScript编译器去获取来自于namesArr的所有编号的索引值,然后通过这些值去创建一个类型。
因此,当TypeScript试图推断namesArr数组中包含的所有值的类型时,它将创建一种字符串字面量联合类型,因为数组中的所有值都是常量和只读的。
最后,Names类型将包含如下内容:

type Names = "John" | "Lily" | "Roy";

这就是我们想要的,现在就可以在TypeScript中使用Names类型

How to convert an array into string literal union type in TypeScript?

youtiao66
2 声望0 粉丝