NPMパッケージ開発者のためのtsconfig
パッケージを使う人にもTypeScriptによる型の享受を目指す
パッケージを公開するときは、動作する形で公開するのが前提なのでjs
にする必要があります。つまりコンパイルは必須です。ですがせっかくTypeScriptで作ったのだからパッケージの型情報も提供しましょう。
型定義ファイルも出力する
型定義ファイルを一緒に出力しましょう。そのためにはtsconfig.jsonにあるdeclaration
の項目をtrue
に変更します。
json
"declaration": true,/* Generates corresponding '.d.ts' file. */
json
"declaration": true,/* Generates corresponding '.d.ts' file. */
このように設定するとコンパイルで出力したjs
ファイルと同じディレクトリに同名で拡張子がd.ts
のファイルも出力されるようになります。これが型情報のファイルです。なおこの型定義ファイルだけをコンパイルで出力されたjs
と別のディレクトリに出力するためのオプションは存在しません。
変哲もないnumber
型のプロパティ持つValue Object
を作ったとします。
ts
classNumericalValueObject {privatevalue : number;public constructor(value : number) {this.value =value ;}publicequals (other :NumericalValueObject ): boolean {return this.value ===other .value ;}publictoString (): string {return `${this.value }`;}}
ts
classNumericalValueObject {privatevalue : number;public constructor(value : number) {this.value =value ;}publicequals (other :NumericalValueObject ): boolean {return this.value ===other .value ;}publictoString (): string {return `${this.value }`;}}
これをコンパイルし、型定義を生成するとこのようになっています。
ts
declare classNumericalValueObject {privatevalue ;constructor(value : number);equals (other :NumericalValueObject ): boolean;toString (): string;}
ts
declare classNumericalValueObject {privatevalue ;constructor(value : number);equals (other :NumericalValueObject ): boolean;toString (): string;}
内容自体はちょうどインターフェースのようなファイルとなっています。
宣言元へのジャンプでのts
ファイルを参照できるようにする
IDEを使っているときに有用で、実際のTypeScriptのソースコードがどのようにコーディングされているかを閲覧することができるようになります。tsconfig.jsonにあるdeclarationMap
の項目をtrue
に変更します。
json
"declarationMap": true,/* Generates a sourcemap for each corresponding '.d.ts' file. */
json
"declarationMap": true,/* Generates a sourcemap for each corresponding '.d.ts' file. */
このように設定するとコンパイルで出力したjs
ファイルと同じディレクトリに同名で拡張子がd.ts.map
のファイルも出力されるようになります。このファイルは元のts
と実際に動作するjs
の対応付けをしてくれます。ただしこの設定だけでは不十分で、参照元となる元のts
ファイルも一緒にパッケージとして公開する必要があります。
元のts
も公開する
特に設定していなければ元のts
ファイルも公開されますが、公開する内容を調整している場合は逆にpackage.jsonのfiles
プロパティを変更して元のts
ファイルも公開するように変更が必要です。tsconfig.jsonのdeclarationMap
を設定しても元のts
ファイルを参照できないときはここで公開する内容を制限していないか確認してください。
json
{"name": "YYTS","version": "1.0.0","license": "CC BY-SA 3.0","sideEffects": false,"main": "./cjs/index.js","module": "./esm/index.js","types": "./esm/index.d.ts","files": ["dist", "src"],"scripts": {"build": "yarn build:cjs && yarn build:esm","build:cjs": "tsc -p tsconfig.cjs.json","build:esm": "tsc -p tsconfig.esm.json"}}
json
{"name": "YYTS","version": "1.0.0","license": "CC BY-SA 3.0","sideEffects": false,"main": "./cjs/index.js","module": "./esm/index.js","types": "./esm/index.d.ts","files": ["dist", "src"],"scripts": {"build": "yarn build:cjs && yarn build:esm","build:cjs": "tsc -p tsconfig.cjs.json","build:esm": "tsc -p tsconfig.esm.json"}}
この例はdist
にコンパイルした結果のjs, d.ts, d.ts.map
があり、src
に元のts
があるものと想定しています。
実際にパッケージとなるファイルにどのようなファイルが含まれているかについては次のコマンドを実行してください。
sh
npm publish --dry-run
sh
npm publish --dry-run
JavaScriptのsourceMap
も出力する
sourceMap
とはAltJSがコンパイルされたJavaScriptとの行を一致させるものです。これがあることによってデバッグやトレースをしているときに、元のts
ファイルの何行目で問題が発生しているかわかりやすくなります。module bundler
を使用するときはこのオプションを有効にしていないと基本的に何もわかりません。このオプションはパッケージを公開しないとしても有効にしておくことが望ましいでしょう。
tsconfig.jsonにあるsourceMap
の項目をtrue
に変更します。
json
"sourceMap": true,/* Generates corresponding '.map' file. */
json
"sourceMap": true,/* Generates corresponding '.map' file. */
こちらもコンパイルで出力したjs
ファイルと同じディレクトリに同名で拡張子がjs.map
のファイルも出力されるようになります。