KotlinがDefinitelyTypedに対応したと聞いたので早速試してみた
概要
- ちょっと試しただけのメモ
- TypeScriptの型定義情報をKotlinの型定義情報に変換するKotlin公式のツール
- d.tsが型の定義を頑張ってくれていれば、Kotlinで楽できる
- ファイル名をそのまま出力のファイル名に使うので、複数のライブラリを使う場合は工夫が必要
- 複数のファイルにまたがって定義されている情報がまだ取り扱えないので、どうしたものか…
インストール
npmでインストールするだけ
npm install ts2kt -g
使い方
ts2kt
コマンドに変換する型定義ファイルを渡すだけ。オプションはディレクトリーを指定する d
だけ。
例:axiosのktファイルを取得する
$ npm init -y $ npm install axios --save $ mkdir kt $ ts2kt -d kt node_modules/axios/index.d.ts Converting node_modules/axios/index.d.ts Save declarations: kt/index.kt
これで、 kt/index.kt
が出来上がる
残念なところ
いくつかサポートされていない機能がある
import
typeof
never
特に import
が対応していないために、複数のファイルにまたがるd.tsがある場合、型情報が正確に出ていないっぽい(よくわかってない)
あと、バグなのか、それとも型定義が間違えているのかわからんけど、落ちてしまうd.tsもあった。
$ npm install @types/whatwg-fetch $ ts2kt -d fetch node_modules/\@types/whatwg-fetch/index.d.ts Converting node_modules/@types/whatwg-fetch/index.d.ts ts2kt: "TypeQuery" kind unsupported yet here! (node_modules/@types/whatwg-fetch/index.d.ts:11:19 to 11:39) ts2kt: "TupleType" kind unsupported yet here! (node_modules/@types/whatwg-fetch/index.d.ts:24:33 to 24:49) /usr/local/lib/node_modules/ts2kt/node_modules/typescript/lib/typescript.js:5738 return identifier.length >= 3 && identifier.charCodeAt(0) === 95 /* _ */ && identifier.charCodeAt(1) === 95 /* _ */ && identifier.charCodeAt(2) === 95 /* _ */ ? identifier.substr(1) : identifier; ^ TypeError: Cannot read property 'length' of undefined at Object.unescapeIdentifier (/usr/local/lib/node_modules/ts2kt/node_modules/typescript/lib/typescript.js:5738:26) at TsClassToKt.TsClassifierToKt.visitMethodDeclaration_7vsj57$ (/usr/local/lib/node_modules/ts2kt/ts2kt.js:969:35) at visitNode (/usr/local/lib/node_modules/ts2kt/ts2kt.js:3939:15) at TsClassToKt.visitClassDeclaration_4wvyue$ (/usr/local/lib/node_modules/ts2kt/ts2kt.js:1024:7) at TypeScriptToKotlin.visitClassDeclaration_4wvyue$ (/usr/local/lib/node_modules/ts2kt/ts2kt.js:1393:16) at visitNode (/usr/local/lib/node_modules/ts2kt/ts2kt.js:3921:15) at /usr/local/lib/node_modules/ts2kt/ts2kt.js:3897:7 at visitEachNode (/usr/local/lib/node_modules/ts2kt/node_modules/typescript/lib/typescript.js:8343:30) at Object.forEachChild (/usr/local/lib/node_modules/ts2kt/node_modules/typescript/lib/typescript.js:8503:24) at forEachChild_0 (/usr/local/lib/node_modules/ts2kt/ts2kt.js:3901:24)