1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeScriptでCLIツールを作ってみた

Last updated at Posted at 2022-08-11

就活の面接の練習をする友達がいなかったので、自動でランダムの質問をしてくれるプログラムを作ってみた。

準備

% npm init
% npm install typescript ts-node process

tsconfig.jsonに以下を追加する。

"moduleResolution": "node"

"resolveJsonModule": true

コード

ディレクトリはこんな感じ。

.
├── index.ts
├── types.ts
├── json
│   └── mensetsu.json
├── node_modules
├── package-lock.json
├── package.json
└── tsconfig.json

質問内容のデータはJSONでこんな感じに用意する。

json/mensetsu.json
{
    "mensetsu": [
        {
            "question": "自己PR",
            "answer": [
                "私の強みは、学ぶことが好きであるということです。",
                "自分のまだ知らないことを知りたいという知的好奇心が高く、中学や高校、医学部での座学や実習も全て面白く感じ、楽しんで自ら学んできました。",
                "医学の発展は日進月歩であり、生涯学び続けることが必要な医師として働く上で、非常に大きな強みであると考えております。"
            ]
        },
        {
            "question": "当院を志望した理由",
            "answer": [ ... ]
        },
        ...
    ]
}

中身はこんな感じ。

switch文でデータ切り替えられるので、就活終わった後も他のことに使えるかも。

index.ts
import readline from "readline"
import { Question } from "./types"
import Mensetsu from "./json/mensetsu.json"

/**
 * 環境変数で扱うデータを切り替える
 */
let array: Array<Question>
const obj: string | undefined = process.env.OBJ

switch (obj) {
  case 'mensetsu':
    array = Mensetsu.mensetsu
}

/**
 * 標準入力を取得する
 */
const question = (question: string): Promise<string> => {
  const readlineInterface = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  })
  return new Promise((resolve) => {
    readlineInterface.question(question, (answer: string) => {
      resolve(answer)
      readlineInterface.close()
    })
  })
}

async function prompt(msg: string): Promise<string> {
    const answer: string = await question(msg)
    return answer.trim()
}

const main = async () => {
  console.log('');
  console.log('↓↓↓Enterキーを押して操作してください↓↓↓');
  console.log('');
  for (;;) {
    const dialog = array[Math.floor(Math.random() * array.length)]
    await prompt('\x1b[36mQ.'+dialog.question)
    console.log('\x1b[35mA.\x1b[0m');
    dialog.answer.forEach((answer: string) => {
      console.log(answer);
    })
    console.log('')
  }
}

// 起動
(async () => {
  await main()
})()
types.ts
export type Question = {
    question: string
    answer: Array<string>
}

yarnのscriptsにコマンドを追加しておく。

package.json
"scripts": {
  "start": "OBJ=mensetsu ./node_modules/.bin/ts-node index.ts"
}

実行するとこんな感じ。

% yarn start
yarn run v1.22.19
$ OBJ=mensetsu ./node_modules/.bin/ts-node index.ts

↓↓↓Enterキーを押して操作してください↓↓↓

Q.大学生活の一番思い出深いこと
A.

まとめ

ちょっとした単語帳とか作りたいなってときに使えそう。
ちなみに面接本番は準備不足で爆死。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?