Require.js单例到TypeScript

时间:2012-10-19 18:50:45

标签: javascript singleton requirejs typescript

这是两个淡化的示例文件。目前这是它们作为requirejs模块的工作方式。我已经在我的require配置中对api.js进行了调整,以将导出定义为API。目标是这些将作为单身人士。我正在尝试将它们转换为TypeScript等价物,但无法弄清楚如何将它们保存为单例并将它们传递给各种模块,就像我现在一样。

RequireJS风格

api.js

(function (global) {

    var API = global.API = {};
    API.version = '0.0.1';
    API.env = 'local';
    API.header = '';

} (this));

auth.js

define([
    'api',
], function (api) {
        'use strict';

        CommonAuth = {

            maxExpiredAuthorizationRetries: 1,

            getAuthorizationHeader: function () {
                return api.header;
            },

            setAuthorizationHeader: function (val) {
                api.header = val;
            }

        };

        return CommonAuth;

    }
);

TypeScript / AMD(requirejs)样式

到目前为止,我已经得到了以下内容,但这显然不是我追求的目标。

auth.ts

// don't know how to fake this without creating a valid api module. requirejs shim is what handles my export
import api = module("api");

export module Common {

    class Auth {

        public maxExpiredAuthorizationRetries: number;

        constructor (maxExpiredAuthorizationRetries: number) {
            this.maxExpiredAuthorizationRetries = maxExpiredAuthorizationRetries;
        }

        public getAuthorizationHeader(): string {
            return api.header();
        }

        public setAuthorizationHeader(val: string): void {
            api.header(val);
        }
    }

    var auth = new Auth(1);
}

编译为 auth.js tsc auth.ts --module amd

define(["require", "exports", "api"], function(require, exports, __api__) {
    var api = __api__;

    (function (Common) {
        var Auth = (function () {
            function Auth(maxExpiredAuthorizationRetries) {
                this.maxExpiredAuthorizationRetries = maxExpiredAuthorizationRetries;
            }
            Auth.prototype.getAuthorizationHeader = function () {
                return api.header();
            };
            Auth.prototype.setAuthorizationHeader = function (val) {
                api.header(val);
            };
            return Auth;
        })();        
        var auth = new Auth(1);
    })(exports.Common || (exports.Common = {}));

})

更新:除了接受的答案,您还可以直接导出所有成员:

export var maxExpiredAuthorizationRetries: number = 1;
export function getAuthorizationHeader(): string { ...
export function setAuthorizationHeader(val: string): string {

然后import api = module('api');可以简单地通过说api.getAuthorizationHeader()来使用。

1 个答案:

答案 0 :(得分:3)

如果您正在寻找Singleton,我会在类中使用静态成员。像这样:

在api.ts

class Api {
    static version:string = '0.0.1';
    static header:string = '';
}

export = Api

在auth.ts

import Api = module("api");

class Auth {

    //...

    public getAuthorizationHeader(): string {
        return Api.header;
    }

    public setAuthorizationHeader(val: string): void {
        Api.header = val;
    }
}