TypeScript代码批量转换成lua代码

lua是一门很精巧的脚本语言,目前也颇受国内unity游戏开发者的欢迎。假如现在有一个TypeScript项目,想快速改成lua项目,手动修改明显太耗时间了,现在跟大家推荐一个开源node工具:ts2lua。
ts2lua的Github地址
使用ts2lua很简单,下面我们来测试一下。
首先,运行命令行cmd,建立一个目录ts2lua_test用于测试,使用npm安装ts2lua:

G:\>mkdir ts2lua_test

G:\>cd ts2lua_test

G:\ts2lua_test>npm i ts2lua
npm WARN saveError ENOENT: no such file or directory, open 'G:\package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open 'G:\package.json'
npm WARN !invalid#1 No description
npm WARN !invalid#1 No repository field.
npm WARN !invalid#1 No README data
npm WARN !invalid#1 No license field.

+ ts2lua@1.0.13
added 7 packages from 7 contributors and audited 7 packages in 2.669s
found 0 vulnerabilities

接下来我们输入node进入交互模式,使用require命令来使用ts2lua:

G:ts2lua_test\>node
> ts2lua = require('ts2lua')
{ translate: [Function: translate],
  translateFiles: [Function: translateFiles] }
>

可以看到,ts2lua暴露了2个接口,分别是translatetranslateFiles,从方法名字可以看出来,一个用于转换ts语句,一个用于批量转换ts代码文件。先来试试translate方法:

> code = `
... function doStr(a: number, b: number): void {
... return a + b;
... }
... let c = doStr(1, 2);
... console.log('c = ' + c);`
'\nfunction doStr(a: number, b: number): void {\nreturn a + b;\n}\nlet c = doStr(1, 2);\nconsole.log(\'c = \' + c);'
> console.log(ts2lua.translate(code))
function doStr(a, b)
  return a + b
end

local c = doStr(1, 2)
print('c = ' .. c)
undefined
>

可以看到,ts2lua确实将ts代码转换为lua代码了,ts字符串连接被转换成..console.log被转换为print
接下来试试批量转换ts代码文件,先输入.exit退出node,然后在ts2lua_test目录下新建两个目录in和out:

> .exit

G:ts2lua_test\>mkdir in

G:ts2lua_test\>mkdir out

G:ts2lua_test\>

接下来我们在in目录中放入几个ts文件,你可以把自己现有的ts文件放进去,我这里临时写2个简单的ts文件放进去:

G:ts2lua_test\>node
> tscontent = `
... class A {
...   private id = 0;
...   private name = 'classA';
...   constructor(id: number, name: string) {
.....   this.id = id;
.....   this.name = name;
..... }
... }`
'\nclass A {\n  private id = 0;\n  private name = \'classA\';\n  constructor(id: number, name: string) {\n  this.id = id;\n  this.name = name;\n}\n}'
> tscontent2 = `
... class B extends A {
...   private age = 10;
...   constructor(age: number) {
.....   super(2, 'classB');
.....   this.age = age;
..... }
... }`
'\nclass B extends A {\n  private age = 10;\n  constructor(age: number) {\n  super(2, \'classB\');\n  this.age = age;\n}\n}'
> let fs = require('fs')
undefined
> fs.writeFileSync('in/A.ts', tscontent)
undefined
> fs.writeFileSync('in/B.ts', tscontent2)
undefined
> .exit

G:\ts2lua_test>

现在in目录下有了2个ts代码文件,我们使用ts2lua将其转换为lua文件并生成到out目录下:


image.png
G:\ts2lua_test>node
> ts2lua = require('ts2lua')
{ translate: [Function: translate],
  translateFiles: [Function: translateFiles] }
> ts2lua.translateFiles('in', 'out', { ext: '.lua.txt' })
2 .lua files generated.
undefined
> .exit

G:\ts2lua_test>
image.png

可以看到,ts2lua成功生成了后缀名为.lua.txt的lua代码文件并放在out目录下,同时还附带了class.lua.txt和trycatch.lua.txt,这两个是ts2lua使用的简单的面向对象实现方法,下面我们看看生成的lua代码是什么样子的:

A.lua.txt

require("class")

Class:subclass("A")
A.prototype.id = 0;
A.prototype.name = 'classA';
function A.prototype:ctor(id, name)
  self.id = id
  self.name = name
end

B.lua.txt

require("class")

A:subclass("B")
B.prototype.age = 10;
function B.prototype:ctor(age)
  B.super(2, 'classB')
  self.age = age
end

最后,ts2lua提供了TypeScript声明文件,我们来看看这两个接口的定义:

// Type definitions for index.js
// Project: https://github.com/Halliwood/ts2lua 
// Definitions by: Halliwood <https://github.com/Halliwood> 
// Definitions: https://github.com/borisyankov/DefinitelyTyped

export interface TranslateOption {
  ext?: string, 
  style?: 'xlua' | null
}
// ...
/**
 * Translate the input code string.
 * @param tsCode input code string.
 */
export declare function translate(tsCode : string, option ?: TranslateOption): string;
// ...
/**
 * Translate typescript files from the given input path and write lua files into the given output path.
 * @param inputPath input path which contains typescript files to translate.
 * @param outputPath output path where to write lua files into.
 * @param option translate option
 */
export declare function translateFiles(inputPath : string, outputPath : string, option ?: TranslateOption): void;

可见,translateFiles接受一个可选参数option,可以用于指定转换选项,ext字段用于指定生成的lua文件后缀,比如上述例子我们指定的.lua.txt,style字段用于指定生成的lua代码的风格,可以看出目前支持xlua。`
ts2lua还是蛮好用的,大家可以试试~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352