如何将联合体类型转换为打字稿中的枚举?

时间:2019-07-09 02:02:01

标签: typescript

我想将联合类型隐蔽为枚举或像打字稿中的枚举

我的大脑无法正常工作。

感谢您阅读我的问题。

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.
    }
}

所以我想隐瞒联合类型来枚举...

4 个答案:

答案 0 :(得分:1)

最简单的解决方案是只使用string enum

enum Status {
    start = 'start',
    loading = 'loading',
    stop = 'stop'
}


class Loading {
    static staticStatus: Status;
}

Loading.staticStatus = Status.loading;

更多

String enums

答案 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枚举共有三种类型:

  1. 数字枚举
  2. 字符串枚举
  3. 异构枚举

数字枚举 默认情况下,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']

兼容

它允许您将并集中的类型用作枚举值并进行兼容的检查。