厳選TypeScript  〜おすすめしたいライブラリ、ツール、ノウハウ、情報源のリンク集〜

個人的にTypeScriptプロジェクトで使って良かったと感じたライブラリやツール、役立ったノウハウ・情報源へのリンクをまとめていきます。随時更新します。

* **記事更新時に通知を受け取りたい方はこの投稿を「ストック」してください。**
* 追加された内容は[更新履歴](https://qiita.com/suin/items/bf877f1289e451ffd0b0/revisions)をご覧ください。

## 書籍

* [『実践TypeScript ~BFFとNext.js&Nuxt.jsの型定義~』](https://amzn.to/2ZDZLlb) - JavaScriptからTypeScriptに来た人が読むと、JSとTSの差分を学ぶことができる本。
* [『JavaScript Primer: ECMAScript 2019時代のJavaScript入門書』](https://jsprimer.net/) - すでにプログラミング経験がある人が読むとJavaScriptの文法や機能を中心に学ぶことができる本。TypeScriptを書くにもJavaScriptの知識が必要不可欠なので、雰囲気でJSを書いてきた人やちゃんとおさらいしたい人におすすめ。ブラウザで無償で読める。
* [現代の JavaScript チュートリアル javascript.info](https://ja.javascript.info/)

## ツール

* 凡例
    * `✶` 気になってるだけで使ったことがない

### 本家製のツール

* [TypeScript playground](http://www.typescriptlang.org/play/) - ブラウザ上でTypeScriptが手軽に試せる。

### NPM

* [npmhub](https://npmhub.org/) - GitHubリポジトリのpackage.jsonを解釈して、どのパッケージを使っているかをブラウザ上に表示してくれるChrome拡張(Firefox拡張もある)。
* [sort-package-json](https://github.com/keithamus/sort-package-json#readme) - package.jsonの並び順を自動的に正してくれるツール
* [npm-check-updates](https://github.com/tjunnone/npm-check-updates) - 依存するパッケージの新しいバージョン(アップグレード候補)を教えてくれ、選択したパッケージの新バージョン番号をpackage.jsonに書き込んでくれるツール。別名`ncu`コマンド。`yarn upgrade`は、package.jsonの内容は変えてくれないため、かゆいところに手が届くツール。

### DX

* [ts-node](https://github.com/TypeStrong/ts-node) - Node.jsでTypeScriptコードをコンパイルなしに直接実行できる。REPLも。
* [ts-node-dev](https://github.com/whitecolor/ts-node-dev) - ソースコード変更を検知して自動再起動する機能をts-nodeに付け足したもの。

### モノレポ

* [lerna](https://github.com/lerna/lerna) - ひとつのGitリポジトリに複数のNodeモジュールを入れる開発スタイルを快適にさせてくれる。yarn workspacesの上位互換的な存在。

### コード品質

* [urish/typewiz](https://github.com/urish/typewiz)✶ - 実行時の型情報を学習し、型情報を自動的にTypeScriptコードに追記してくれるツール。
    * 解説ブログ: [Manual Typing is No Fun: Introducing TypeWiz! - Uri Shaked - Medium](https://medium.com/@urish/manual-typing-is-no-fun-introducing-typewiz-58e3e8813f4c)
* [lint-staged](https://github.com/okonet/lint-staged) - git commitの対象となったファイルに対して、prettier, eslintなど任意のリントコマンドを実行し、修正されたコードをコミットに自動的に含めてくれて便利。

### ドキュメント生成

* [docsify](https://docsify.js.org/#/)✶ - Markdownで書いたドキュメントをウェブサイトにするツール。GitBookと違い、静的ファイルを生成しない。
* [Docz](https://www.docz.site/)✶ - Gatsbyをベースに作られたドキュメント生成ツール。MDXに対応している。
* [typedoc](https://typedoc.org/guides/installation/) - TypeScriptコードを解析し、APIリファレンスを自動生成してくれるツール。とてもいいという訳ではないが、今のところこれしかない。

### 型定義の自動生成

* [Transform](https://transform.tools/) - JSONやJSON Schema、GraphQL SchemaからTypeScriptの`interface`を生成してくれるGUIツール。紹介記事: [42種ものデータ変形がブラウザだけでできる『transform』が便利そう - Qiita](https://qiita.com/suin/items/04db26b91244fb3cbc8b)


## 手法

### Conventional Commits

* [Conventional Commits](https://www.conventionalcommits.org/ja/v1.0.0-beta.4/) - 機械的に処理しやすいコミットメッセージの書き方についての規約
* [commitizen](https://github.com/commitizen/cz-cli) - インタラクティブCLIで質問に答えていく形で、Conventional Commits準拠のコミットメッセージを生成してくれるツール。`git cz`というコマンドが生える。
* [commitlint](https://github.com/conventional-changelog/commitlint) - コミットメッセージがConventional Commitsに準拠しているかチェックするツール。
* [lerna](https://github.com/lerna/lerna) - モノレポを実現するためのツールだが、Conventional Commitsに対応していて、パッケージのバージョン採番を自動でやってくれる。





## ノウハウ

### TypeScriptの言語仕様

* [TypeScriptのObject型とobject型は同じ……と思うじゃん? - Qiita](https://qiita.com/suin/items/928642e48959e864a74e)
* `interface`と型エイリアスの共通点と相違点
    * [TypeScriptのInterfaceとTypeの比較 - Qiita](https://qiita.com/tkrkt/items/d01b96363e58a7df830e)
    * [TypeScript interface vs. type | pawelgrzybek.com](https://pawelgrzybek.com/typescript-interface-vs-type/)
* 型ガード(type guards)
    * [TypeScript: interfaceにはinstanceofが使えないので、ユーザ定義タイプガードで対応する - Qiita](https://qiita.com/suin/items/0ce77f31cbaa14031288)
* 制御フローベースの型分析
    * [TypeScript 2.0: Control Flow Based Type Analysis — Marius Schulz](https://mariusschulz.com/blog/typescript-2-0-control-flow-based-type-analysis)
    * [TypeScript で any や as を使わなくても型チェックをすり抜けてしまう話(Optional Propertyの危険性) - Qiita](https://qiita.com/reismannnr2/items/59746550b4b37119cece)
* 関数オーバーロード
    * [TypeScriptの関数オーバーロードの単純な例 - Qiita](https://qiita.com/suin/items/1e3bfde2cdf8513057b7)
* クラスとインターフェイス
    * [TypeScriptのclassは暗黙のうちにinterfaceを定義しているのと同義 - Qiita](https://qiita.com/suin/items/3b58e2151a29db0735b0)
* Nominal Typing
    * [TypeScript: 異なる2つの型システム「公称型」と「構造的部分型」 - Qiita](https://qiita.com/suin/items/52cf80021361168f6b0e)
    * [TypeScriptでNominal Typingを実現する4つの方法 - Qiita](https://qiita.com/suin/items/57cfc0ec9bb1a6995aa5)
* `unknown`と`any`の相違点
    * [TypeScript 3.0: The unknown Type — Marius Schulz](https://mariusschulz.com/blog/typescript-3-0-the-unknown-type)
* ジェネリクス
    * ジェネリクスがどういう問題を解決してくれるのか？を学ぶ
        * [ジェネリクス - サバイバルTypeScript](https://book.yyts.org/generics)
        * [4歳娘「パパ、具体的な名前をつけないで？」 - Qiita](https://qiita.com/Yametaro/items/bcd3166e5d2ad696a89e)
* [TypeScript の流儀 - Speaker Deck](https://speakerdeck.com/takefumiyoshii/typescript-falseliu-yi) - コンパイラの型推論器が型をどう考え、どういうコードを書いたら意図がコンパイラによく伝わるかがよく分かるスライド。『実践TypeScript ~BFFとNext.js&Nuxt.jsの型定義~』の著者Takepepeさん作。

### JavaScript

* [4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them](https://auth0.com/blog/four-types-of-leaks-in-your-javascript-code-and-how-to-get-rid-of-them/) - 4種類のメモリリークとその対処法

### NPM

* [Typescript: Working with Paths, Packages and Yarn Workspaces - Medium](https://medium.com/@rossbulat/typescript-working-with-paths-packages-and-yarn-workspaces-6fbc7087b325) - TypeScriptのパスエイリアス(tsconfig.jsonの`path`)やyarn workspacesを使ったモノレポプロジェクトの作り方
* [How to make a beautiful, tiny npm package and publish it - Medium](https://medium.com/free-code-camp/how-to-make-a-beautiful-tiny-npm-package-and-publish-it-2881d4307f78) - npmにパッケージを公開する最小の方法。初めてnpmパッケージを公開するときに読むとわかりすい。最小限と言うだけあって、やることはアカウント作成とpackage.jsonのnameとversionの設定だけ。
* [Node Hero - Node.js Project Structure Tutorial | @RisingStack](https://blog.risingstack.com/node-hero-node-js-project-structure-tutorial/) - Node.jsプロジェクトのディレクトリ構成のDOとDON'T。
* [Renovate | Automated Dependency Updates](https://renovatebot.com/) - 依存するNPMパッケージの更新をプルリクエストで提案してくれるボット

### Node.js

* [sindresorhus/awesome-nodejs: Delightful Node.js packages and resources](https://github.com/sindresorhus/awesome-nodejs)(邦訳 [Awesome Node.js : 素晴しい Node.js フレームワーク・ライブラリ・ソフトウェア・リソースの数々 - Qiita](https://qiita.com/hatai/items/61030176a254cbe7ff2b))
* [How to Debug a Node.js app in a Docker Container | @RisingStack](https://blog.risingstack.com/how-to-debug-a-node-js-app-in-a-docker-container/) - Dockerコンテナ内のNodeインスペクタをChrome Developer ToolsやVisual Studio Codeから使ってデバッグする方法。
* [🛑 You don't need passport.js - Guide to node.js authentication ✌️](https://softwareontheroad.com/nodejs-jwt-authentication-oauth/?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more) - JWT(JSON Web Token)を使った認証の理論と実践。
* [Debugging Node.js Applications for Memory Leaks | Toptal](https://www.toptal.com/nodejs/debugging-memory-leaks-node-js-applications) - Node.jsアプリケーションのメモリリークの原因追跡方法やそれをサポートするツールについて。
* [Node.js Post-Mortem Diagnostics & Debugging | @RisingStack](https://blog.risingstack.com/post-mortem-diagnostics-debugging-node-js-at-scale/) - Node.jsがクラッシュしたときにレポートを残してくれるnode-reportモジュールの使用法。

### Node.jsでのログ/ロギング

* [A Guide to Node.js Logging - Twilio](https://www.twilio.com/blog/guide-node-js-logging?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more) - ロギングの実践術と、ロギングライブラリの使い分け。`debug`モジュールと`DEBUG`環境変数を用いた標準的なロギング術。
* [How to Get Node.js Logging Right | @RisingStack](https://blog.risingstack.com/node-js-logging-tutorial/) - 正しいログのとり方。ログの4大要件とは。モジュール、アプリケーション、分散システムでのロギングアプローチの違いとは。

### Express.js

* [Node.js Security Checklist | @RisingStack](https://blog.risingstack.com/node-js-security-checklist/) - Node.jsのセキュリティチェックリスト。Express公式サイトからも参照されている必読文献。

## ライブラリ

TypeScriptプロジェクトでも使いやすいNodeモジュールを紹介します。

* 凡例
    * `†` TypeScript製
    * `✶` 気になってるだけで使ったことがない

### ライブラリのキュレーションメディア

* [Best of JavaScript](https://bestofjs.org/) - 人気の高いJS/TSライブラリをキュレーティングしているサイト。npm公式の検索より筋のいいライブラリに出会いやすい。

### 日付・時刻

* [date-fns](https://date-fns.org/) - 標準のDateを操作するための便利な日付関数群

### CSV

* ~~[csv](https://csv.js.org/) - CSVの読み書きライブラリ。~~ TypeScript製のfast-csvのほうが型宣言がしっかりしている。
* [fast-csv](https://c2fo.io/fast-csv/)† - NodeのためのCSV読み書きライブラリ。

### CLI

* [oclif](https://oclif.io/)† - シングルバイナリのデプロイまで考えられたHeroku発のCLIフレームワーク。
* ~~[gluegun](https://infinitered.github.io/gluegun/#/)† - フルスタックCLIフレームワーク~~ oclifのほうがフラグなどの型安全だったり、gluegunが提供しているtoolboxもoclifに同等のものが同梱されているため、gluegunを選ぶ理由がないと感じた。

### DOM

* [cheerio](https://cheerio.js.org/) - サーバサイドでjQuery風のDSLでHTMLを操作できる

## ブログ

### TypeScript関連ブログ

* [Latest Posts — Marius Schulz](https://mariusschulz.com/)

### JavaScript関連ブログ

* [RisingStack Engineering - Node.js Tutorials & Resources](https://blog.risingstack.com/)

## Twitter

* [TypeScript Daily（@TypeScriptDaily）さん / Twitter](https://twitter.com/typescriptdaily)