mike-neckのブログ

Java or Groovy or Swift or Golang

Kotlin ts2kt の使い方メモ

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)