JavaScript
es6
es2015

ES6でenum(列挙型)を実現する

es6には標準でenumがないため、自前でenum風のクラスを作ってみたいと思います。
今回はhttpリクエストのメソッドを列挙型で表現します。

定義

class HTTP_METHOD {
    static get get() {
        return HTTP_TYPE_OBJECT.get;
    }

    static get post() {
        return HTTP_TYPE_OBJECT.post;
    }

    static get put() {
        return HTTP_TYPE_OBJECT.put;
    }

    static get delete() {
        return HTTP_TYPE_OBJECT.delete;
    }

    get string() {
        switch (this) {
            case HTTP_TYPE.get:
                return 'GET';
            case HTTP_TYPE.post:
                return 'POST';
            case HTTP_TYPE.put:
                return 'PUT';
            case HTTP_TYPE.delete:
                return 'DELETE';
            default:
                return null
        }
    }
}

const HTTP_METHOD_OBJECT = {
    get: new HTTP_TYPE(),
    post: new HTTP_TYPE(),
    put: new HTTP_TYPE(),
    delete: new HTTP_TYPE(),
};

使い方

HTTP_METHODは直接newしてインスタンスを作ってはいけません。
必ずstaticメソッドを使って該当のHTTP_METHODを取得してください。

function postSome() {
    let postUrl = "https://hoge/post"
    let param = {
        hoge: "hoge"
    }
    request(postUrl, HTTP_METHOD.post, param)
}

function getSome() {
    let postUrl = "https://hoge/get"
    let param = {
        hoge: "hoge"
    }
    request(postUrl, HTTP_METHOD.get, param)
}

function request(url, method, param) {
    switch (method) {
            case HTTP_METHOD.post:
            case HTTP_METHOD.delete:
            case HTTP_METHOD.put:
                fetch(url, {
                    method: method.string,
                    body: JSON.stringify(param),
                });
                break;
            case HTTP_METHOD.get:
                searchParamsString = "";
                Object.keys(params).forEach((key) => {
                    searchParamsString += key + "=" + params[key] + "&";
                });
                searchParamsString = searchParamsString.slice(0, searchParamsString.length - 1);
                fetch(url + "?" + searchParamsString, {
                    method: method.string,
                });
        }
}