如何将现有数组转换为TypeScript字符串文字类型?

kb5ga3dv  于 2023-03-24  发布在  TypeScript
关注(0)|答案(1)|浏览(170)

TypeScript array to string literal type询问并接收关于如何在数组声明时创建字符串文字的答案。我想知道是否可以从 * 已经存在 * 的数组创建字符串文字。
举一个基本的例子:

const furniture = ['chair', 'table', 'lamp'];
type Furniture = 'chair' | 'table' | 'lamp';

在声明时建议的已知解决方案是:

const furniture = ['chair', 'table', 'lamp'] as const;

这将数组锁定为readonly。是否可以直接获取数组并从中创建一个新项?

const furniture = ['chair', 'table', 'lamp'];
const furntureLiteral = furniture as const;

// Yields: "readonly [string[]]" typing.
// Wanted: "readonly ["chair", "table", "lamp"]" typing.

或者是因为静态类型而不可能实现?

3htmauhk

3htmauhk1#

您希望将furniture用于两个不同的目的:记住它初始化的值的字符串文字类型,但也可以在将来保存任意其他字符串。TypeScript并没有真正为您提供使用单个变量完成这两项工作的灵活性。最简单的方法可能是有两个变量,一个用于一种用途。
您可以通过constAssert来跟踪初始化器,该Assert“锁定”结果变量:

const initialFurniture = ['chair', 'table', 'lamp'] as const;
type InitialFurniture = typeof initialFurniture[number];
// type InitialFurniture = "chair" | "table" | "lamp"

然后将其复制到一个可变的字符串数组中,这样你就可以做任何你想做的事情:

const furniture: string[] = [...initialFurniture];
furniture.push("futon");
furniture.push("hammock");
furniture.push("cupboard");

现在你已经分离了关注点,TypeScript编译器也很满意。
Playground代码链接

相关问题