想要把字符串数组转换为字符串字面量联结类型,能够先应用 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?