🧵

JavaScriptのタグ付きテンプレートを使ってpath.joinをスマートにやる

2023/04/03に公開

JavaScriptでファイルなどのパスを連結するとき、Node.jsのpath.join関数を使うことが多いと思います。単純な文字列連結でも良いですが、デミリタ(多くの場合は/)の重複やプラットフォームの差異などを考えるとpath.joinを使うのが良いです。

ところが、ついつい`${someDir}/foo/bar/${fileName}`のように書きたくなってしまいます。
path.join(someDir, 'foo/bar', fileName)と書くのは少々面倒に感じるというか、やや直感的ではない感じがします。

そこで、Tagged Template Literalを使って、スマートに書ける書き方を考えてみました。
まず、joinという関数を定義します。

import path from 'path'

function join(strings: TemplateStringsArray, ...args: unknown[]): string {
  return path.join(
    ...strings.flatMap((str, i) =>
      i === 0 ? [str] : [String(args[i - 1]), str]
    )
  )
}

次のように使います。

const someDir = '/home/someone/test/'
const fileName = 'cool.ts'

join`${someDir}/foo/bar/${fileName}` // => /home/someone/test/foo/bar/cool.ts

以上です。

Discussion