You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 12中如何从JS文件调用函数至TS文件

问题描述

我正在使用基于JavaScript构建的外部API,需要调用JS文件中的函数。主文件位于src/assets/openlayers/scripts/main.js,已在index.html中导入所有相关JS文件:

<script src="/assets/openlayers/scripts/libs/jquery-1.10.2.min.js"></script>
<script src="/assets/openlayers/scripts/libs/jquery-ui-1.10.3.custom/jquery-ui-1.10.3.custom.min.js"></script>
<script src="/assets/openlayers/scripts/libs/proj4js-1.1.0/proj4js-compressed.js"></script>
<script src="/assets/openlayers/scripts/libs/OpenLayers-2.13.1/OpenLayers.js"></script>

<script src="/assets/openlayers/scripts/main.js"></script>
<script src="/assets/openlayers/scripts/classes/event.js"></script>
<script src="/assets/openlayers/scripts/classes/drawing.js"></script>
<script src="/assets/openlayers/scripts/classes/culturesDrawing.js"></script>
<script src="/assets/openlayers/scripts/classes/cultureMarkerDrawing.js"></script>
<script src="/assets/openlayers/scripts/map/map.initialize.js"></script>
<script src="/assets/openlayers/scripts/map/map.js"></script>
<script src="/assets/openlayers/scripts/map/map.tool.js"></script>
<script src="/assets/openlayers/scripts/map/map.tools.js"></script>
<script src="/assets/openlayers/scripts/map/map.cookies.js"></script>
<script src="/assets/openlayers/scripts/map/map.custom.controls.js"></script>
<script src="/assets/openlayers/scripts/map/map.contextmenu.js"></script>
<script src="/assets/openlayers/scripts/map/map.info.js"></script>
<script src="/assets/openlayers/scripts/map/map.drawingLayer.js"></script>
<script src="/assets/openlayers/scripts/map/map.layerStyle.js"></script>
<script src="/assets/openlayers/scripts/map/map.spatialLayer.js"></script>
<script src="/assets/openlayers/scripts/map/map.rasterLayer.js"></script>
<script src="/assets/openlayers/scripts/map/map.Legend.js"></script>
<script src="/assets/openlayers/scripts/map/map.rasterLegend.js"></script>
<script src="/assets/openlayers/scripts/map/map.layerSwitcher.js"></script>
<script src="/assets/openlayers/scripts/map/map.tooltip.js"></script>
<script src="/assets/openlayers/scripts/map/map.obsolete.js"></script>

现在需要在.ts文件中调用main.js里的部分函数,但不想像下面这样逐个在TS文件中声明变量:

declare var drawGauge: any;

import { Component, Input, OnInit } from '@angular/core';

@Component({
  selector: 'app-geospacial-map',
  templateUrl: './geospatial-map.component.html',
  styleUrls: ['./geospatial-map.component.scss'],
})
export class GeospacialMapComponent implements OnInit {

  constructor() {}

  ngOnInit(): void {

  }
}

请问是否可以全局访问该JS文件中的所有内容?

解决方案

当然可以通过以下几种方式实现全局访问,避免逐个声明变量:

1. 创建全局类型声明文件(推荐)

在项目的src目录下新建一个全局类型声明文件(比如global.d.ts),在里面统一声明main.js暴露的全局变量/函数,所有TS文件都会自动识别这些声明:

// src/global.d.ts
// 如果main.js的函数挂载在window对象上
declare interface Window {
  drawGauge: any;
  // 把main.js中需要访问的所有函数、属性都添加到这里
  anotherFunction: () => void;
  someGlobalValue: string;
}

// 如果main.js有独立的全局命名空间
declare namespace MainScripts {
  function drawGauge(): void;
  function createMarker(): void;
}

之后在任意TS文件中直接使用:

// 挂载在window的情况
window.drawGauge();

// 独立命名空间的情况
MainScripts.createMarker();

如果不想写具体类型,直接用any即可,这样既能避免逐个声明,还能获得基本的代码提示。

2. 修改JS文件为ES模块(若允许修改JS代码)

如果可以修改main.js,把它改成ES模块格式,导出需要的函数:

// main.js
export function drawGauge() {
  // 原函数逻辑
}

export function anotherFunction() {
  // 原函数逻辑
}

之后在TS文件中直接导入使用:

import * as MainScripts from '../assets/openlayers/scripts/main.js';

MainScripts.drawGauge();

3. 临时方案:使用类型断言直接访问

如果只是临时使用,不想创建声明文件,可以直接通过window对象加类型断言访问:

(window as any).drawGauge();

这种方式无需额外声明,但没有类型提示,适合快速测试场景。

内容的提问来源于stack exchange,提问作者Gonçalo Bastos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:50:48