enums

作者: JamesSawyer | 来源:发表于2017-12-09 19:01 被阅读110次

字符串枚举(String Enums)

ts v2.4 支持字符串枚举,即枚举的的成员可以是字符串类型,以前只能是数值类型。

enum MediaTypes {
    JSON = 'application/json',
    XML = 'application/xml'
}

# 使用
fetch("https://example.com/api/endpoint", {
    headers: {
        Accept: MediaTypes.JSON
    }
}).then(response => {
    // ...
});

转换ES3/5代码

var MediaTypes;
(function (MediaTypes) {
    MediaTypes["JSON"] = "application/json";
    MediaTypes["XML"] = "application/xml";
})(MediaTypes || (MediaTypes = {}));
fetch("https://example.com/api/endpoint", {
    headers: {
        Accept: MediaTypes.JSON  // 注意此处没有被直接替代成 "application/json"
    }
}).then(function (response) {
    // ...
});

注意:

  • 字符串值枚举成员不能反向映射(reverse mapping)

即:

MediaTypes["JSON"];              // "application/json"
MediaTypes["application/json"];  // undefined

MediaTypes["XML"];               // "application/xml"
MediaTypes["application/xml"];   // undefined

普通枚举(数值类型枚举)

enum DefaultPorts {
    HTTP = 80,
    HTTPS = 443
}

编译:

var DefaultPorts;
(function (DefaultPorts) {
    DefaultPorts[DefaultPorts["HTTP"] = 80] = "HTTP";
    DefaultPorts[DefaultPorts["HTTPS"] = 443] = "HTTPS";
})(DefaultPorts || (DefaultPorts = {}));

存在反向映射

DefaultPorts["HTTP"];   // 80
DefaultPorts[80];       // "HTTP"

DefaultPorts["HTTPS"];  // 443
DefaultPorts[443];      // "HTTPS"

使用 const enum 产生内联成员

# 使用const enum
const enum MediaTypes {
    JSON = 'application/json',
    XML = 'application/xml'
}

# 示例
fetch("https://example.com/api/endpoint", {
    headers: {
        Accept: MediaTypes.JSON
    }
}).then(response => {
    // ...
});

编译:

fetch("https://example.com/api/endpoint", {
    headers: {
        Accept: "application/json" /* JSON */   # 枚举值内联,直接显示出来
    }
}).then(function (response) {
    // ...
});

这样的好处是可以节省一点代码

preserveConstEnums tsconfig选项

有时候我们希望使用 const enums 保留这种映射,可以在 tsconfig.json 中设置

# tsconfig.json
{
    "compilerOptions": {
        "target": "es5",
        "preserveConstEnums": true
    }
}

# index.ts
const enum MediaTypes {
    JSON = 'application/json',
    XML = 'application/xml'
}

# 示例
fetch("https://example.com/api/endpoint", {
    headers: {
        Accept: MediaTypes.JSON
    }
}).then(response => {
    // ...
});

编译

# 下面是保留的映射代码
var MediaTypes;
(function (MediaTypes) {
    MediaTypes["JSON"] = "application/json";
    MediaTypes["XML"] = "application/xml";
})(MediaTypes || (MediaTypes = {}));

fetch("https://example.com/api/endpoint", {
    headers: {
        Accept: "application/json" /* JSON */ # 依然是内联
    }
}).then(function (response) {
    // ...
});

原文章

相关文章

  • enums

    字符串枚举(String Enums) ts v2.4 支持字符串枚举,即枚举的的成员可以是字符串类型,以前只能是...

  • How do the different enum varian

    There are four different aspects to enums in TypeScript y...

  • intent bundle enum

    Enums are Serializable so there is no issue.Given the fol...

  • ITEM 38: 使用接口模拟扩展枚举

    ITEM 38: EMULATE EXTENSIBLE ENUMS WITH INTERFACES  enum类型...

  • Item 35: Use instance fields ins

    Many enums are naturally associated with a single int val...

  • Swift 的Enums

    简评:代数类型并不是专指某种类型,而是对原有类型的一种思考方式。合理的使用 Sum 类型,能让代码的可读性大大提高...

  • TypeScript学习-Enums

    Enums使得我们能够定义有名字的数字常量集 枚举体包含0个或多个枚举成员。枚举成员都对应一个数字值,这个数字值可...

  • Enums, Equatable, and exhaustive

    英文原文现在你有这样的一个枚举: 你想要对它进行相等性的判断,因为这个枚举有关联值,相等性的判断必须手动的来进行添...

  • ATS hook EVENT

    # ATS hook EVENT ```c /** This set of enums represents th...

  • 《Effective Java》笔记(下)

    《Effective Java》笔记(下) Enums and Annotations Item 30: Use ...

网友评论

    本文标题:enums

    本文链接:https://www.haomeiwen.com/subject/qsjpixtx.html