首页 > 解决方案 > 如何从打字稿文件中调用 js 函数?

问题描述

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

我尝试添加一些类型声明,但 Visual Studio 仍然抱怨getJsonNoCache. 我得到错误

“错误 TS2339 (TS) 属性 'getJsonNoCache' 在类型 '{ postJson(url: string, command: any, onSuccess?: any, onError?: any): void; getJson(url: string, query: any, onSuccess?: any, onError?: any): void; }'。”

这是我的 javascriptfile,它作为捆绑包包含在我的网站中。

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;
    }));
  });
};

标签: javascripttypescript

解决方案


最简单的方法是 assert scp.networkas typeany以使编译器跳过检查以下属性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 转译器你的运行时有一个scp像这样类型的全局变量,然后转译器可以从声明中告诉你并检查类型的正确性。


推荐阅读