gpt4 book ai didi

typescript :在全局范围内使用类函数

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:44 24 4
gpt4 key购买 nike

我目前正在为即将到来的学校项目尝试使用 Typescript,但我在测试我的小程序时遇到了问题。我想要实现的是,当我单击一个按钮时,我的程序开始运行。问题是当我单击按钮时,我无法设法让我的 GameManager 类中的函数执行。我使用的 3 个相关文件是:

index.html,我在其中设置了按钮

GameManager.ts,其中包含我要调用的函数

Test.ts,这是我要测试程序的文件


游戏管理器.ts

此文件包含我要调用的函数 updateCycle()

import { Inventory } from "./Inventory"
import { ForeignTrader } from "./ForeignTrader";

export class GameManager {

private timer;
inventory: Inventory;
foreignTrader: ForeignTrader;

constructor() {

}

public gameLoop() {
this.inventory.update(this.foreignTrader.getResourceDelivery());
}
public updateCycle() {
setInterval(() => this.gameLoop(), 5000);
}
}

index.html

<html>
<head>
<link rel="stylesheet" type="text/css" href="interface.css" />
</head>
<body>
<button id="button1" onclick="updateCycle()">Click Me!</button>
<br />
Gold: <span id="gold">0</span>
<br />
Wood: <span id="wood">0</span>
<br />
<script type="text/javascript" src="Library.js"></script>
<script type="text/javascript" src="Resources.js"></script>
<script type="text/javascript" src="Inventory.js"></script>
<script type="text/javascript" src="ForeignTrader.js"></script>
<script type="text/javascript" src="GameManager.js"></script>
<script type="text/javascript" src="Test.js"></script>

</body>
</html>

我已经尝试谷歌搜索,问题似乎是我的函数在本地范围内,因为我总是收到错误:

(index):6 Uncaught ReferenceError: updateCycle is not defined
at HTMLButtonElement.onclick (http://localhost/TradeGame/Trade%20Game/:6:48)
onclick @ (index):6

但无论我尝试什么,我都不知道如何将我需要的函数放到全局范围内。这里的主要问题是,我也无法将 GameManager 导入到我的 Test.ts 文件中,因为这会自动为其提供自己的范围。有什么方法可以让我在点击按钮时使用该功能吗?

tsconfig.json 看起来像这样:

{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"noImplicitAny": false,
"sourceMap": false
},
"exclude": [
"node_modules"
]
}

最佳答案

不幸的是,由于浏览器本身不支持 commonjs 模块,如果没有 bundler ,这将是困难的但并非不可能

在您进一步阅读之前,请先查看 Webpack , Browserify , 或 SystemJS . Typescript也有webpack教程on their website (它使用的是 React,但我认为您仍然可以理解)。

如果 bundler 超出了您的项目范围,或者您只是真的想照常进行您不能从单独的文件导入/导出内容

如果您尝试按原样加载脚本,您可能还会在控制台中看到类似这样的错误,对吧?:

Uncaught ReferenceError: require is not defined

这就是 bundler 修复的问题。它注入(inject)您正在导入/导出的脚本来代替所有这些require

要在不使用 bundler 的情况下解决此问题,所有内容都必须存在于同一个文件中(糟糕)。但是 - 只是为了彻底 - 我在下面有一个 GameManager 在按钮点击时被调用的例子。

index.html

tml>
<head>
</head>
<body>
<button id="button1" onclick="manager.updateCycle()">Click Me!</button>
<br />
Gold: <span id="gold">0</span>
<br />
Wood: <span id="wood">0</span>
<br />
<script type="text/javascript" src="test.js"></script>
<script>
var manager = new GameManager();
</script>
</body>
</html>

test.ts

class GameManager {
updateCycle(): void {
console.log('Update')
}
}

一些最后的说明:

  • 请注意,我从您的原始示例中删除了 export。这会在浏览器中产生另一个语法错误。
  • 我还在导入后新建创建了一个GameManager实例,因为updateCycle是一个public函数(而不是 static 一个)。我还更新了按钮中的 onClick 以反射(reflect)这一点。

关于 typescript :在全局范围内使用类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com