web-dev-qa-db-ja.com

既存のJavaScriptライブラリから.d.ts "typings"定義ファイルをどのように作成しますか?

私は自分のライブラリとサードパーティのライブラリの両方を使用しています。 「typings」ディレクトリにはJqueryおよびWinRTの一部が含まれていますが、どのように作成されますか?

162
Hotrodmonkey

問題のライブラリ、ライブラリの作成方法、探している精度のレベルに応じて、いくつかのオプションが利用できます。オプションをおおまかに降順で確認してみましょう。

すでに存在しているかもしれない

最初に必ずDefinitelyTyped( https://github.com/DefinitelyTyped/DefinitelyTyped )を確認してください。これは、文字通り何千もの.d.tsファイルでいっぱいのコミュニティリポジトリであり、使用しているものが既にそこにある可能性が非常に高いです。また、NPMが公開する.d.tsファイルの検索エンジンであるTypeSearch( https://Microsoft.github.io/TypeSearch/ )も確認する必要があります。これには、DefinitelyTypedよりもわずかに多くの定義が含まれます。いくつかのモジュールは、NPMディストリビューションの一部として独自の定義を出荷しているため、独自のモジュールを作成する前に、それが当てはまるかどうかも確認してください。

たぶん、あなたはそれを必要としない

TypeScriptは--allowJsフラグをサポートするようになり、.jsファイルでより多くのJSベースの推論を行うようになります。 --allowJs設定と一緒にコンパイルに.jsファイルを含めてみて、十分な型情報が得られるかどうかを確認できます。 TypeScriptは、これらのファイル内のES5スタイルのクラスやJSDocコメントなどを認識しますが、ライブラリが奇妙な方法で初期化されるとトリップする可能性があります。

--allowJsを使ってみる

--allowJsで適切な結果が得られ、より良い定義ファイルを自分で作成したい場合は、--allowJs--declarationを組み合わせて、ライブラリのタイプでのTypeScriptの「最良の推測」を確認できます。これによりまともな出発点が得られ、JSDocコメントが適切に記述されており、コンパイラーがそれらを見つけることができた場合、手書きのファイルと同じくらい良いかもしれません。

Dts-genを始めましょう

--allowJsが機能しなかった場合は、dts-gen( https://github.com/Microsoft/dts-gen )を使用して開始点を取得できます。このツールは、オブジェクトのランタイムシェイプを使用して、使用可能なすべてのプロパティを正確に列挙します。プラス面では、これは非常に正確になる傾向がありますが、このツールは、追加のタイプを取り込むためのJSDocコメントのスクレイピングをまだサポートしていません。次のように実行します:

npm install -g dts-gen
dts-gen -m <your-module>

これにより、現在のフォルダーにyour-module.d.tsが生成されます。

スヌーズボタンを押す

後ですべてを行い、しばらくの間型を使用しない場合は、TypeScript 2.0で次のように記述できます。

declare module "foo";

import型の"foo"モジュールをanyできます。後で対処したいグローバルがある場合は、

declare const foo: any;

foo変数が得られます。

200
Ryan Cavanaugh

Ryanの説明のようにtsc --declaration fileName.tsを使用するか、プロジェクトでdeclaration: trueをすでに持っていると仮定して、tsconfig.jsoncompilerOptionsの下にtsconfig.jsonを指定できます。

39
JayKan

これに対処する最良の方法(宣言ファイルが DefinitelyTyped で利用できない場合)は、ライブラリ全体ではなく、使用するものだけの宣言を書くことです。これにより、作業が大幅に削減されます。また、コンパイラーは、メソッドの欠落について不満を言うことによって支援します。

15
Gorgi Kosev

Ryanが言うように、tscコンパイラには--declarationファイルから.d.tsファイルを生成する.tsスイッチがあります。 (バグがない限り)TypeScriptはJavascriptをコンパイルできるはずなので、既存のjavascriptコードをtscコンパイラーに渡すことができます。

12
CCoder

http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript at 00:33:52で説明されているように、彼らはツールを構築しましたWebIDLおよびWinRTメタデータをTypeScript d.tsに変換する

7
zowers

Script#またはSharpKitをサポートするサードパーティのJSライブラリの既存のマッピングを探します。これらのC#から.jsへのクロスコンパイラのユーザーは、現在直面している問題に直面し、サードパーティのライブラリをスキャンしてスケルトンC#クラスに変換するオープンソースプログラムを公開している可能性があります。その場合は、スキャナープログラムをハックして、C#の代わりにTypeScriptを生成します。

それに失敗すると、サードパーティのlibのC#パブリックインターフェイスをTypeScript定義に変換する方が、ソースJavaScriptを読み取って同じことを行うよりも簡単な場合があります。

私の特別な関心は、SenchaのExtJS RIAフレームワークであり、Script#またはSharpKitのC#解釈を生成するプロジェクトが公開されていることを知っています。

2
camelCase

単一のTypeScript定義ファイルを作成するPowerShellと、最新のJavaScriptを使用した複数の*.jsファイルを含むライブラリを次に示します。

最初に、すべての拡張子を.tsに変更します。

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

次に、TypeScriptコンパイラを使用して定義ファイルを生成します。多数のコンパイラエラーが発生しますが、それらは無視できます。

Get-ChildItem | foreach { tsc $_.Name  }

最後に、すべての*.d.tsファイルを1つのindex.d.tsに結合し、importステートメントを削除して、各exportステートメントからdefaultを削除します。

Remove-Item index.d.ts; 

Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
  foreach { Get-Content $_ } | `
  where { !$_.ToString().StartsWith("import") } | `
  foreach { $_.Replace("export default", "export") } | `
  foreach { Add-Content index.d.ts $_ }

これは、多くの定義を含む単一の使用可能なindex.d.tsファイルで終わります。

2
Shaun Luttin