如何从打字稿文件中调用js函数?

时间:2019-07-09 08:12:19

标签: javascript typescript

我有一个javascript文件,其功能包含ajaxcall。我试图从我的打字稿文件中调用该函数。我猜是因为我没有声明类型,但是我不确定如何写呢?

我试图添加一些类型声明,但是Visual Studio仍然抱怨getJsonNoCache。我收到错误

  

“错误TS2339(TS)属性'getJsonNoCache'在类型'{   postJson(URL:字符串,命令:任何,onSuccess ?:任何,onError ?:任何):   虚空getJson(URL:字符串,查询:任何,onSuccess ?:任何,onError ?:   任何):无效; }'。”

这是我的javascript文件,它作为捆绑软件包含在我的网站中。

scp.network.getJsonNoCache = function(url, query, onSuccess, onError, statusCodeEvents) {
  $.ajax({
    contentType: 'application/json; charset=utf-8',
    type: "GET",
    url: url,
    data: query,
    cache: false,
    statusCode: {
      401: function() {
        window.location = '/';
      },
      405: function() {
        rfq.mainModel.errorHeader('Information');
      }
    },
    success: function(data) {
      if (onSuccess !== undefined)
        onSuccess(data);
    },
    error: function(data) {
      if (onError !== undefined) {
        onError(data);
      }
    },
    dataType: "json",
  });
};

这是我的ts文件中的函数,我正试图调用该函数。

this.getUsers = (callback: any, text: string) => {
  if (text.length < 2) {
    callback([]);
    return;
  }

  scp.network.getJsonNoCache(audit.queries.GET_INTERNAL_USERS, {
    searchText: text,
    maxCount: 10,
    roleId: 5
  }, function(data: any) {
    this.queriedUsers = data.users;
    console.log(data.users);

    callback(_.map(this.queriedUsers, function(user: any) {
      return user.name;
    }));
  });
};

1 个答案:

答案 0 :(得分:3)

最简单的方法是将scp.network声明为类型any,以使编译器跳过对scp.network属性的检查:

(scp.network as any).getJsonNoCache(...)

如果要提高类型的正确性,可以declare键入scp:

declare var scp: {
  network: {
    getJsonNoCache: (
      url: string,
      query: Record<string, string | number>,
      onSuccess?: (data: any) => void,
      onError?: (error: any) => void,
    ) => void;
  };
};

上面的代码告诉TypeScript transpiler您的运行时具有一个全局变量scp,其类型类似于这样,然后transpiler可以从声明中进行判断并为您检查类型的正确性。