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

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