从文字类型生成随机值对象

问题描述 投票:0回答:2

我正在使用一个具有如下声明类型的库:

type MyType = "value1" | "value2" | "value3";

我想创建一个对象,其中包含随机选择的可能值之一的值。

我原本以为

MyType
类型被定义为
enum
,但实际上它的定义如上。我引用了这个答案:https://stackoverflow.com/a/55699349

本质上,我正在寻找一种通用的解决方案来在运行时检索文字类型的可能值,然后随机获取其中一个。这是我正在寻找的非工作版本:TypeScript Playground

如有任何帮助,我们将不胜感激。谢谢!

typescript types literals
2个回答
0
投票

我通过评论了解到这是不可能的,因为类型被删除了。更多详细信息请参见此处:https://www.typescriptlang.org/docs/handbook/2/basic-types.html#erased-types


0
投票

使用常规数组作为真相来源

将您的值定义为常规数组,并将其用于两者您的输入并在运行时生成随机选择。

这在 TS 3.4 中是可能的,使用 const 断言

步骤

1。创建一个数组,并在末尾添加

as const

const myValues = ['value1', 'value2', 'value3'] as const

2。使用数组创建类型

使用

typeof someArray[number]
最终成为数组中所有条目的并集;类型只能是数组条目。

type myType = typeof myValues[number]

3.选择随机数组条目

对于

myType
的实例,选择一个随机数组条目,或执行任何您想要设置的值。仅允许数组条目(通过 Typescript)。

旁注:为了运行时类型安全,您可能需要查看 Zod 或等效的运行时类型检查器。这将改变你定义真相来源的方式。

const someInstance:myType = myValues[myValues.length * Math.random() | 0] 

或者只是设置明确的值:

// Fails (typescript warning because it doesn't exist in the array)
const someInstance:myType = 'Foo' 

// Works (no typescript warning)
const someInstance:myType = 'value3' 
© www.soinside.com 2019 - 2024. All rights reserved.