NPMパッケージ開発者のためのtsconfig
#
パッケージを使う人にもTypeScriptによる型の享受を目指すパッケージを公開するときは、動作する形で公開するのが前提なのでjs
にする必要があります。つまりコンパイルは必須です。ですがせっかくTypeScriptで作ったのだからパッケージの型情報も提供しましょう。
#
型定義ファイルも出力する型定義ファイルを一緒に出力しましょう。そのためにはtsconfig.jsonにあるdeclaration
の項目をtrue
に変更します。
typescript
"declaration": true,/* Generates corresponding '.d.ts' file. */
typescript
"declaration": true,/* Generates corresponding '.d.ts' file. */
このように設定するとコンパイルで出力したjs
ファイルと同じディレクトリに同名で拡張子がd.ts
のファイルも出力されるようになります。これが型情報のファイルです。なおこの型定義ファイルだけをコンパイルで出力されたjs
と別のディレクトリに出力するためのオプションは存在しません。
変哲もないnumber
型のプロパティ持つValue Object
を作ったとします。
typescript
class NumericalValueObject {private value: number;public constructor(value: number) {this.value = value;}public equals(other: NumericalValueObject): boolean {return this.value === other.value;}public toString(): string {return `${this.value}`;}}
typescript
class NumericalValueObject {private value: number;public constructor(value: number) {this.value = value;}public equals(other: NumericalValueObject): boolean {return this.value === other.value;}public toString(): string {return `${this.value}`;}}
これをコンパイルし、型定義を生成するとこのようになっています。
typescript
declare class NumericalValueObject {private value;constructor(value: number);equals(other: NumericalValueObject): boolean;toString(): string;}
typescript
declare class NumericalValueObject {private value;constructor(value: number);equals(other: NumericalValueObject): boolean;toString(): string;}
内容自体はちょうどインターフェースのようなファイルとなっています。
ts
ファイルを参照できるようにする#
宣言元へのジャンプでのIDEを使っているときに有用で、実際のTypeScriptのソースコードがどのようにコーディングされているかを閲覧することができるようになります。tsconfig.jsonにあるdeclarationMap
の項目をtrue
に変更します。
typescript
"declarationMap": true,/* Generates a sourcemap for each corresponding '.d.ts' file. */
typescript
"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
ファイルを参照できないときはここで公開する内容を制限していないか確認してください。
typescript
{"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"}}
typescript
{"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
があるものと想定しています。
実際にパッケージとなるファイルにどのようなファイルが含まれているかについては次のコマンドを実行してください。
typescript
npm publish --dry-run
typescript
npm publish --dry-run
sourceMap
も出力する#
JavaScriptのsourceMap
とはAltJSがコンパイルされたJavaScriptとの行を一致させるものです。これがあることによってデバッグやトレースをしているときに、元のts
ファイルの何行目で問題が発生しているかわかりやすくなります。module bundler
を使用するときはこのオプションを有効にしていないと基本的に何もわかりません。このオプションはパッケージを公開しないとしても有効にしておくことが望ましいでしょう。
tsconfig.jsonにあるsourceMap
の項目をtrue
に変更します。
typescript
"sourceMap": true,/* Generates corresponding '.map' file. */
typescript
"sourceMap": true,/* Generates corresponding '.map' file. */
こちらもコンパイルで出力したjs
ファイルと同じディレクトリに同名で拡張子がjs.map
のファイルも出力されるようになります。