lua 这个语言真的有意思,它由 C 语言构成,又实现了 C 语言所没有的「对象」。早在不知道哪年搞 cocos2d 的时候,就接触了这个语言

hammerspoon 也不是什么新鲜东西了,早在 18 年,公司内部一次「杂鱼分享会」就有人提到了这个工具 —— 快速将光标切到目标显示器以及窗口调整

早期是用过一段时间,写了一个代替小黑帽🎩的工具,后来不了了之。主要还是觉得现在不想用这个语言,太阴间了

当然还有其他方案,比如常见的用到了 moonscript,这是一个类 coffeescript 的语言,属于 lua 生态圈的东西。但用这个就意味着你需要在本机构建一个 lua 环境(luarock),这么一想那不想干了,现在不用 lua 了还留一个完全不用的开发环境

前些日子关注到有一个项目 TypeScriptToLua / TypeScriptToLua,一直没尝试,这波机会刚好。而且老前端了,谁还没有个 typescript/node 环境呢

安装

虽然是个编译工具,但没必要全局安装,npm init 一个项目出来,直接用即可

1
2
npm init
yarn add typescript-to-lua --dev

然后在 package.jsonscript 中加一行build

1
2
"dev": "tstl --watch",
"build": "tstl"

也就能用了。建议是看一下这个文档,有一些需要「通过类型文件也就是 d.ts 来控制产物」的文档,还是有必要读一下的

类型文件

有需要的朋友可以看一下我的 typings.d.ts,真的靠interface一把梭,不考虑程序设计,只求能 work

当然这个「不合理」是要解决的,择日解决完之后,发个包,封装一下

注意点

函数、方法

开发的这个过程是没有什么点,不要玩花,正常使用typescript即可。只是通过这次重构,我才领悟到「方法」和「函数」的区别…

hammerspoon docs 提到函数其实就是 static,表现是.连接的;而实例化之后所使用的方法,是:连接的。所以这里要注意的就是产物的self指向。函数的话需要在 d.ts 中写上@noSelf,不然编译时会被改成:

pcall

一个执行函数的函数,这里有一个坑:被执行的函数需要指定一下this,也就是xxx.bind(Cla),不然会因为self指向了全局而触发不到对应的方法