我想将联合类型隐蔽为枚举或像打字稿中的枚举
我的大脑无法正常工作。
感谢您阅读我的问题。
type status = 'start' | 'loading' | 'stop';
class Loading {
static staticStatus: status;
}
Loading.staticStatus.start; // i want to use.
或
type status = 'start' | 'loading' | 'stop';
enum statusEnum = ?????;
class Loading {
static staticStatus = statusEnum;
}
Loading.staticStatus.start; // i want to use.
对不起,我没有详细说明问题。
const schema ={
status: Joi.string()
.required()
.valid(
'start',
'loading',
'stop',
)
}
// type setStatusType = 'start' | 'loading' | 'stop' is like this
type setStatusType = PickType<Joi.extractType<typeof schema>, 'status'>;
enum statusEnum = ?????;
class Loading {
static staticStatus = statusEnum;
public setLoading() {
this.status = Loading.staticStatus.loading // I want to use this.
}
}
所以我想隐瞒联合类型来枚举...
答案 0 :(得分:1)
最简单的解决方案是只使用string enum
:
enum Status {
start = 'start',
loading = 'loading',
stop = 'stop'
}
class Loading {
static staticStatus: Status;
}
Loading.staticStatus = Status.loading;
答案 1 :(得分:1)
不确定如何从enum
获得Union
,但是如果需要两者,则可以轻松地进行相反操作。
enum Status {
start,
loading,
stop
}
type StatusAsUnion = keyof typeof Status
希望这很有用
答案 2 :(得分:0)
枚举用
enum
关键字定义,如下所示:
writing-readable-code-with-typescript-enums
enum Continents {
North_America,
South_America,
Africa,
Asia,
Europe,
Antartica,
Australia
}
// usage
var region = Continents.Africa;
TypeScript enums
的类型
TypeScript枚举共有三种类型:
数字枚举 默认情况下,TypeScript枚举是基于数字的。这意味着它们可以将字符串值存储为数字。可以将数字和与其兼容的任何其他类型分配给枚举的实例。假设我们要在周末存储几天。 TypeScript中的代表枚举可以看起来像这样:
enum Weekend {
Friday,
Saturday,
Sunday
}
在上面的代码块中,我们有一个称为Weekend的枚举。枚举具有三个值,即:星期五,星期六和星期日。在TypeScript中,就像在其他语言中一样,枚举值从零开始,对每个成员增加一个。它们将像这样存储:
Friday = 0
Saturday = 1
Sunday = 2
尽管我们可以使用自己的逻辑自定义存储值,但是我们看到枚举始终为存储分配了数字,该值始终为零。
自定义数字枚举 在TypeScript中,允许我们指定枚举的第一个数字值。使用上面的周末示例,我们可以像这样初始化第一个数字值:
enum Weekend {
Friday = 1,
Saturday,
Sunday
}
上面的代码块将星期五存储为1,将星期六存储为2,将星期日存储为3。如果将数字添加到第一个成员,则其余成员仍将按顺序递增一个。但是,我们有能力通过给它们任何数值来指示我们不希望出现连续跟踪。下面的代码块是语义的,可以在TypeScript中使用:
enum Weekend {
Friday = 1,
Saturday = 13,
Sunday = 5
}
就像TypeScript中的其他数据类型一样,我们可以将枚举用作函数参数或返回类型,如下所示:
前端应用程序监视识别修复程序获取免费试用版>
enum Weekend {
Friday = 1,
Saturday,
Sunday
}
function getDate(Day: string): Weekend {
if ( Day === 'TGIF') {
return Weekend.Friday;
}
}
let DayType: Weekend = getDate('TGIF');
在上面的代码块中,我们声明了一个周末枚举。然后,我们声明了一个getDate函数,该函数采用输入Day来返回Weekend枚举。在该函数中,我们检查某些条件,该条件现在返回一个枚举成员。
字符串枚举 到目前为止,我们仅查看成员值是数字的枚举。在TypeScript中,您的枚举成员也可以是字符串值。字符串枚举由于其有意义的字符串值,对于在错误日志记录和调试期间易于阅读而言至关重要且易于处理。
enum Weekend {
Friday = 'FRIDAY',
Saturday = 'SATURDAY',
Sunday = 'SUNDAY'
}
然后可以将其用于比较条件语句中的字符串,如下所示:
enum Weekend {
Friday = 'FRIDAY',
Saturday = 'SATURDAY',
Sunday ='SUNDAY'
}
const value = someString as Weekend;
if (value === Weekend.Friday || value === Weekend.Sunday){
console.log('You choose a weekend');
console.log(value);
}
在上面的示例中,我们已经定义了一个字符串枚举,周末与上面的数字枚举一样,但是这次将枚举值作为字符串。数字枚举和字符串枚举之间的明显区别是,数字枚举值通常会自动顺序增加,而字符串枚举值不会自动递增,而是每个值都是独立初始化的。
异构枚举 TypeScript还允许将字符串和数字混合在一起,称为异构枚举值:
enum Weekend {
Friday = 'FRIDAY',
Saturday = 1,
Sunday = 2
}
尽管这是可能的,但可能需要此用例的场景范围确实很小。因此,除非您真的想巧妙地利用JavaScript的运行时行为,否则建议您不要使用异构枚举。
计算枚举 就像TypeScript中的任何其他number数据类型一样,数字枚举的值可以是常量或可以求值。您可以使用计算值定义或初始化数字枚举:
enum Weekend {
Friday = 1,
Saturday = getDate('TGIF'),
Sunday = Saturday * 40
}
function getDate(day : string): number {
if (day === 'TGIF') {
return 3;
}
}
Weekend.Saturday; // returns 3
Weekend.Sunday; // returns 120
规则#1 —
当枚举包含计算成员和常量成员的混合物时,未初始化的枚举成员首先出现,或者必须在其他带有数字常量的初始化成员之后出现。
在上面忽略此规则会产生一个初始化错误-如果您看到此错误,请记住相应地重新排列枚举成员。
常量枚举 如果要提高数字枚举的性能,可以将其声明为常量。让我们用我们的周末示例来说明:
enum Weekend {
Friday = 1,
Saturday,
Sunday
}
var day = Weekend.Saturday;
当编译为JavaScript
时,运行时将在运行时查找Weekend,并查找Weekend.Saturday。为了在运行时获得最佳性能,可以将枚举改为常量,如下所示:
const enum Weekend {
Friday = 1,
Saturday,
Sunday
}
var day = Weekend.Saturday;
使用常量编译时生成的JavaScript是:
var day = 2;
我们看到编译器在看到const时如何仅内联枚举用法,甚至不费心为枚举声明生成JavaScript。当您有一些需要数字到字符串或字符串到数字查找的用例时,务必要意识到这一选择及其后果。您还可以传递编译器标志preserveConstEnums,它仍然会生成Weekenddefinition。
反向映射 TypeScript枚举支持反向映射,这仅意味着就像我们可以访问枚举成员的值一样,我们也可以访问枚举名称本身。下面是我们第一个演示的样本:
enum Weekend {
Friday = 1,
Saturday,
Sunday
}
Weekend.Saturday
Weekend["Saturday"];
Weekend[2];
在上面的代码块中,Weekend.Saturday将返回2,然后Weekend["Saturday"]
也将返回2,但是有趣的是,由于反向映射,Weekend[2]
将返回其成员名称Saturday。这是由于反向映射。我们可以看到TypeScript使用log命令解释反向映射的简单方法:
enum Weekend {
Friday = 1,
Saturday,
Sunday
}
console.log(Weekend);
如果您在控制台中运行它,您将看到以下输出:
{
'1': 'Friday',
'2': 'Saturday',
'3': 'Sunday',
Friday : 1,
Saturday : 2,
Sunday : 3
}
对象包含枚举,既显示为值,也显示为名称,正如TypeScript预期的那样。这显示了TypeScript中反向映射的潜力。
何时使用TypeScript枚举 在某些地方和合适的用例中,使用枚举是最佳且非常有效的
枚举可以在数组初始化中使用,就像其他TypeScript数据类型一样
这是一个简单的例子:
enum NigerianLanguage {
Igbo,
Hause,
Yoruba
}
//can be used in array initialisation
let citizen = {
Name: 'Ugwunna',
Age: 75,
Language: NigerianLanguage.Igbo
}
理想情况下,枚举应用于存在明显不同的值的情况下,例如一周的7天:
enum Days {
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
枚举还可以用于需要在变量中表示字符串或常量的地方。
答案 3 :(得分:0)
在我的情况下,我使用下一个
import { IExternal } from 'external';
enum Types = {
FIRST = 'first',
SECOND = 'second'
}
interface IInternal extends Pick<IExternal, 'types'> {
types: Types
}
IExternal ['types'] ==='first'| “第二” | “某物” | 'else';
IInternal ['types'] ==='first'| '第二';并与IExternal ['types']
兼容它允许您将并集中的类型用作枚举值并进行兼容的检查。