TypeScript从其他模块调用静态函数

时间:2017-07-03 08:07:36

标签: javascript typescript

当我想在另一个模块中创建全局函数时,我遇到了一个问题

utils.ts文件(包含全局函数)

/// <reference path="jquery/index.d.ts" />
/// <reference path="knockout/index.d.ts" />
'use strict';

module com.test.project {
    export class utils {
        self: any;

        constructor() {
            this.self = this;
        }

        public postData(url: string, data: any): any {
            var dfd = $.Deferred();
            $.ajax({
                url: url,
                data: JSON.stringify(data),
                type: 'post',
                contentType: "application/json; charset=utf-8",
                dataType: 'json',
                cache: false,
                success: function(result) {
                    return dfd.done(result);
                },
                error: function(result) {
                    return dfd.reject(result);
                }
            });
        }
    }
}

login.ts(在里面调用全局函数)

/// <reference path="jquery/index.d.ts" />
/// <reference path="knockout/index.d.ts" />
'use strict';

module com.test.project.login {
    export class ScreenModel {
        self: any;
        userName: KnockoutObservable<string>;
        password: KnockoutObservable<string>;

        constructor() {
            this.self = this;
            this.userName = ko.observable("") as KnockoutObservable<string>;
            this.password = ko.observable("") as KnockoutObservable<string>;
        }

        private submit(): void {
            var dataObject = {
                "userName": this.userName(),
                "password": this.password()
            }
            // ↓ error here
            com.test.project.utils.postData("loginService.do", dataObject).done(function(result) {
                window.location.href = "index.do";
            }).reject(function(result) {
                alert("error");
            });
        }
    }

    $(document).ready(function() {
       ko.applyBindings(new ScreenModel()); 
    });
}

模块com.test.project和类utils中的全局函数,通常是模块中的全局函数调用者,如com.test.project。[function]和类ScreenModel。 如何调用ScreenModel类中的全局函数?

2 个答案:

答案 0 :(得分:0)

您已在问题标题中找到它:您必须将其声明为static,例如public static postData。生成的JavaScript存在巨大差异,请参阅typescript playground

如果没有静态,则将函数分配给原型,因此您需要该类的实例来调用该函数。

答案 1 :(得分:0)

我认为你在Java风格中考虑的太多了:我建议你在utils模块中声明一个带有postData函数的对象,然后在你的登录中导入该对象模块。

这样的事情:

export const utils = {
  postData(url, data) {
    $.ajax({})
  }
}

// ....

import { utils } from './utils'
utils.postData(url, data)
...

OR

仅导出您的util功能

export function postData(....)

import { postData } from './utils'
postData()