本篇教程由作者设定使用 CC BY-NC 协议。

什么是TypeScript:简单说,就是一种增强了的JavaScript,具有更完善的类型系统,支持类和模板等特性。当编写一些复杂脚本时,使用TypeScript可以使代码更清晰,减少bug。

KubeJS只支持使用JavaScript语言编写脚本。而TypeScript代码可以被编译为JavaScript代码(使用tsc),因此我们就可以编写TS代码,再把它编译成JS文件放到scripts文件夹中实现魔改。

版本:1.20.1,Forge, KubeJS2001.6.5-build.7, ProbeJS6.0.1

VSCode想必大家是安装了的。TypeScript安装可以参考如下文章:如何安装 TypeScript,并配置开发环境以便开始使用_npm 安装typescript-CSDN博客

使用前先运行一下ProbeJS的dump,不然用TS干什么

打开VSCode,打开终端,运行"tsc -v",出现版本号证明TS装好了。

在终端中进入整合包kubejs目录,运行"mkdir server_tsscripts"建立目录存放ts源文件,之后"cd server_tsscripts"。为什么不直接放在server_scripts里呢?因为这KubeJS它虽然不支持TS,但是也会读取server_scripts里的TS文件并把它当作JS来加载,...

运行"tsc --init",此时能够看到生成了一个tsconfig.json文件,打开。

将"target"改为"es5","outDir"改为"../server_scripts/compiled"。

此处也可以改为"../server_scripts",还可启用"allowJS",具体如何配置看个人和团队需求。

"strict"改为false。这样可以保留priority的注释,否则编译出的第一行将不会是priority的注释。是否有更好的解决方案等我再研究研究。

在server_tsscripts目录下新建一个references.ts,输入类似如下形式的内容

其中的32 12 26等数字的来历:先不输入这些行,之后tsc会报错,哪个符号报错了的话,去原来的server_scripts文件建一个JS文件,输入这个符号,用vscode定位这个符号所在的文件,填入即可。到底咋搞等我有空再细说吧,反正就这样这样那样那样...

/// <reference path="../probe/generated/globals.d.ts" />
/// <reference path="../probe/generated/events.d.ts" />
/// <reference path="../probe/generated/internals/internal_32.d.ts" />
/// <reference path="../probe/generated/internals/internal_12.d.ts" />
/// <reference path="../probe/generated/internals/internal_26.d.ts" />

在VSCode菜单栏选择Terminal->Run Task...,菜单选择typescript->tsc: watch...

下面我们来测试一下。在server_tsscripts目录下新建一个test.ts,输入如下内容:

ServerEvents.recipes(event => {
    let dirt: string = "minecraft:dirt";
    event.shapeless(dirt, "minecraft:redstone");
});

一切顺利的话,保存后很快你可以在kubejs/server_scripts/compiled里发现编译好的test.js。此外还可以在server_tsscripts目录下运行命令"tsc"来把ts文件编译到js文件。

启动游戏或者reload,发现已经有了用红石合成泥土的配方,说明我们的ts经过编译成为了能够被KubeJS识别的js文件。

魔改只需要在server_tsscripts目录下进行即可。tsc负责将其编译成js并放到server_scripts中。注意如果要编写JS代码,要放在server_scripts中,或启用allowJS后在server_tsscripts中。无论哪种方式,都可以实现TS和JS的"无缝混编",这意味着引入TS并不必须放弃JS,你仍然可以在一些部分编写JS代码。

希望这篇教程能够抛砖引玉,期待KubeJS大佬们能够使用TypeScript创作出更多NB的脚本。有不到位之处还请各位大佬批评指正。另外,如果有需要,我之后可以制作视频教程演示具体的操作。