少于 1 分钟阅读

想要把字符串数组转换为字符串字面量联合类型,可以先使用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?