TypeScript宣言のジェネレーター — Numio
tsc --declaration --emitDeclarationOnly と同様に、TypeScript のソースから .d.ts 宣言ファイルを出力します。関数本体と初期化子は削除され、クラスの private メンバーは名前だけが残ります。
パッケージをビルドする前に、ライブラリファイルが公開する型の API を確認したい場合。
TypeScript
TypeScript
こんなときに使えます
- パッケージをビルドする前に、ライブラリファイルが公開する型の API を確認したい場合。
- 単一モジュール用に手動で管理する .d.ts や、TypeScript to Flow ツールに渡す宣言だけの入力が必要な場合。
使い方
- TypeScript パネルに TypeScript のモジュールを貼り付けます。
- コードは isTS と declarationOnly を指定して /api/flow-to-typescript に送信され、サーバー上で TypeScript コンパイラーが宣言を出力します。
- 宣言を .d.ts ファイルにコピーします。ページが Prettier で整形するため、インデントは 2 スペースでセミコロンは付きません。
TypeScript
export interface CartItem { sku: string; price: number; qty: number }
export const TAX_RATE = 0.08;
export function subtotal(items: CartItem[]) {
return items.reduce((sum, i) => sum + i.price * i.qty, 0);
}
export class Cart {
private items: CartItem[] = [];
constructor(public readonly currency = "USD") {}
add(item: CartItem) {
this.items.push(item);
return this;
}
}TypeScript 宣言 (.d.ts)
export interface CartItem {
sku: string
price: number
qty: number
}
export declare const TAX_RATE = 0.08
export declare function subtotal(items: CartItem[]): number
export declare class Cart {
readonly currency: string
private items
constructor(currency?: string)
add(item: CartItem): this
}仕様と制限
入力は変換のためにサーバーのルート(/api/flow-to-typescript)に送信されます。ブラウザ内だけで処理されるわけではありません。Next.js の API ルートが受け付けるリクエストボディは、デフォルトで 1 MB までです。
コンパイラーは TypeScript の ES2020 と DOM のライブラリファイルを読み込むため、Promise、Date、Map や、組み込みメソッドから推論される戻り値の型(例では subtotal の number)も正しく書き出されます。
構文エラーがあると変換は止まり、出力の代わりにコンパイラーのメッセージ(例: TS1134 "Variable declaration expected")が表示されます。
入力はそれぞれ 1 つのファイルとしてコンパイルされます。他のモジュールからの import は解決されません。
FAQ
async 関数には対応していますか?
はい。推論された戻り値の型は Promise で包まれるため、Todo[] を返す async 関数は export declare function loadTodos(url: string): Promise<Todo[]> と宣言されます。
private メンバーはどうなりますか?
"private items;" のように名前だけが残ります。型を公開せずに、クラスの形は一致したままになります。
引数のデフォルト値は残りますか?
いいえ。デフォルト値のある引数は省略可能になるため、constructor(public readonly currency = "USD") は constructor(currency?: string) になります。