【TypeScript】JSからTSファイルを読み込む

こんにちは、フリーランスエンジニアの太田雅昭です。

設定ファイルにtsを使いたい

ツールの設定ファイルを、.envやjsで作ることはあっても、tsで作ることは少ないかもしれません。一緒にコンパイルするならいいのですが、そうではなくコンパイル後のコードからtsを読み込むのは面倒だからです。

ts-nodeを使って、jsからtsを読み込む

以下のようにすると、tsを直接コンパイルできます。

import * as tsnode from 'ts-node';

...

const configString = fs.readFileSync(configPath, 'utf-8');
const compiledCode = tsnode
  .create()
  .compile(configString, 'config_dummy.ts');

ここで、config_dummy.tsは単なる識別用の文字列で、何を設定しても良いそうです。(GPT談)

これを使い、config.tsを読み込むスクリプトを書いてみました。

import { Config } from './types';

const config: Config = {
  apiKey: 'your-api-key',
  names: ['John', 'Jane', 'Doe'],
};

export default config;
import * as tsnode from 'ts-node';
import * as path from 'path';
import * as fs from 'fs';
import { Config } from './types';

export function loadConfig(configPath: string): Config {
  try {
    const configString = fs.readFileSync(configPath, 'utf-8');
    const compiledCode = tsnode
      .create()
      .compile(configString, 'config_dummy.ts');
    const compiledPath = path.join(__dirname, 'compiled.js');
    fs.writeFileSync(compiledPath, compiledCode);
    const data = require(compiledPath);
    fs.unlinkSync(compiledPath);
    return data.default;
  } catch (err: any) {
    return {};
  }
}

const config = loadConfig(path.resolve(__dirname, 'config.ts'));
console.log(config);