本文へスキップ

TypeScript宣言のジェネレーター — Numio

tsc --declaration --emitDeclarationOnly と同様に、TypeScript のソースから .d.ts 宣言ファイルを出力します。関数本体と初期化子は削除され、クラスの private メンバーは名前だけが残ります。

パッケージをビルドする前に、ライブラリファイルが公開する型の API を確認したい場合。

TypeScript

TypeScript

こんなときに使えます

  • パッケージをビルドする前に、ライブラリファイルが公開する型の API を確認したい場合。
  • 単一モジュール用に手動で管理する .d.ts や、TypeScript to Flow ツールに渡す宣言だけの入力が必要な場合。

使い方

  1. TypeScript パネルに TypeScript のモジュールを貼り付けます。
  2. コードは isTS と declarationOnly を指定して /api/flow-to-typescript に送信され、サーバー上で TypeScript コンパイラーが宣言を出力します。
  3. 宣言を .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) になります。

仕様を確認する